Una rappresentazione di un blocco di esclusione reciproca.
Questa classe consente agli script di assicurarsi che una sola istanza dello script esegua una determinata sezione di codice alla volta. Questo è particolarmente utile per i callback e gli attivatori, quando un'azione dell'utente potrebbe causare modifiche a una risorsa condivisa e vuoi assicurarti che non ci siano collisioni.
L'esempio seguente mostra come utilizzare un blocco in un gestore di invio del modulo.
// Generates a unique ticket number for every form submission. function onFormSubmit(e) { const targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1); // Gets a script lock before modifying a shared resource. const lock = LockService.getScriptLock(); // Waits for up to 30 seconds for other processes to finish. lock.waitLock(30000); const scriptProperties = PropertiesService.getScriptProperties(); const ticketNumber = Number(scriptProperties.getProperty('lastTicketNumber')) + 1; scriptProperties.setProperty('lastTicketNumber', ticketNumber); // Releases the lock so that other processes can continue. lock.releaseLock(); targetCell.setValue(ticketNumber); }Senza il servizio di blocco, se due utenti inviano il modulo all'incirca nello stesso momento, i numeri dei ticket potrebbero essere gli stessi, poiché la proprietà
last Ticket Number
potrebbe cambiare dopo essere stata letta da Script Properties
, ma prima che il nuovo valore venga riscritto.Metodi
Metodo | Tipo restituito | Breve descrizione |
---|---|---|
has | Boolean | Restituisce true se la serratura è stata acquisita. |
release | void | Rilascia il blocco, consentendo ad altri processi in attesa di continuare. |
try | Boolean | Tenta di acquisire il blocco, con un timeout dopo il numero di millisecondi specificato. |
wait | void | Tenta di acquisire il blocco, generando un timeout con un'eccezione dopo il numero di millisecondi specificato. |
Documentazione dettagliata
has Lock()
Restituisce true se la serratura è stata acquisita. Questo metodo restituirà false se try
o
wait
non sono mai stati chiamati, se è scaduto il tempo di attesa prima che fosse possibile recuperare la serratura o se è stato chiamato release
.
const lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
Invio
Boolean
: true se il blocco è stato acquisito, false in caso contrario
release Lock()
Rilascia il blocco, consentendo ad altri processi in attesa di continuare. Il blocco viene rilasciato automaticamente al termine dello script, ma per maggiore efficienza è meglio rilasciarlo non appena non hai più bisogno dell'accesso esclusivo a una sezione di codice. Questo metodo non ha effetto se il blocco non è stato acquisito.
Tieni presente che, se stai lavorando con un foglio di lavoro, devi chiamare SpreadsheetApp.flush() prima di rilasciare il blocco, per confermare tutte le modifiche in attesa nel foglio di lavoro mentre hai ancora accesso esclusivo.
const lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
try Lock(timeoutInMillis)
Tenta di acquisire il blocco, con un timeout dopo il numero di millisecondi specificato. Questo metodo non ha effetto se la serratura è già stata acquisita.
const lock = LockService.getScriptLock(); const success = lock.tryLock(10000); if (!success) { Logger.log('Could not obtain lock after 10 seconds.'); }
Parametri
Nome | Tipo | Descrizione |
---|---|---|
timeout | Integer | il tempo di attesa per acquisire il blocco, in millisecondi |
Invio
Boolean
: true se il blocco è stato acquisito, false in caso contrario
wait Lock(timeoutInMillis)
Tenta di acquisire il blocco, generando un timeout con un'eccezione dopo il numero di millisecondi specificato. Questo metodo è uguale a try
, tranne per il fatto che genera un'eccezione quando non è possibile acquisire il blocco anziché restituire false.
const lock = LockService.getScriptLock(); try { lock.waitLock(10000); } catch (e) { Logger.log('Could not obtain lock after 10 seconds.'); }
Parametri
Nome | Tipo | Descrizione |
---|---|---|
timeout | Integer | il tempo di attesa per acquisire il blocco, in millisecondi |
Lanci
Error
: se il metodo ha superato il tempo di attesa prima dell'acquisizione della serratura