Una rappresentazione di un blocco di esclusione reciproca.
Questa classe consente agli script di assicurarsi che solo un'istanza dello script esegua una determinata sezione di codice alla volta. Questa opzione è particolarmente utile per i callback e gli attivatori, nei quali un'azione 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 di moduli.
// Generates a unique ticket number for every form submission. function onFormSubmit(e) { var targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1); // Gets a script lock before modifying a shared resource. var lock = LockService.getScriptLock(); // Waits for up to 30 seconds for other processes to finish. lock.waitLock(30000); var 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 Lock, se due utenti inviano il modulo all'incirca contemporaneamente, i numeri dei ticket potrebbero restare allo stesso modo, poiché la proprietà
lastTicketNumber
potrebbe cambiare dopo che è stata letta da ScriptProperties
, ma prima che il nuovo valore venga ripristinato.Metodi
Metodo | Tipo restituito | Breve descrizione |
---|---|---|
hasLock() | Boolean | Restituisce true se il blocco è stato acquisito. |
releaseLock() | void | Rilascia il blocco, consentendo agli altri processi in attesa sul blocco di continuare. |
tryLock(timeoutInMillis) | Boolean | Tentativi di acquisizione del blocco, timeout dopo il numero di millisecondi specificato. |
waitLock(timeoutInMillis) | void | Tentativi di acquisizione del blocco, timeout con un'eccezione dopo il numero di millisecondi specificato. |
Documentazione dettagliata
hasLock()
Restituisce true se il blocco è stato acquisito. Questo metodo restituirà false se tryLock(timeoutInMillis)
o waitLock(timeoutInMillis)
non sono mai stati chiamati, si è verificato un timeout prima che fosse possibile recuperare il blocco o se è stato chiamato releaseLock()
.
var lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
Ritorni
Boolean
: true se il blocco è stato acquisito, altrimenti false
releaseLock()
Rilascia il blocco, consentendo agli altri processi in attesa sul blocco di continuare. Il blocco viene rilasciato automaticamente alla terminazione dello script, ma per una 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 SheetApp.flush() prima di rilasciare il blocco, per eseguire il commit di tutte le modifiche in sospeso nel foglio di lavoro mentre continui all'accesso esclusivo.
var lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
tryLock(timeoutInMillis)
Tentativi di acquisizione del blocco, timeout dopo il numero di millisecondi specificato. Questo metodo non ha effetto se il blocco è già stato acquisito.
var lock = LockService.getScriptLock(); var success = lock.tryLock(10000); if (!success) { Logger.log('Could not obtain lock after 10 seconds.'); }
Parametri
Nome | Tipo | Descrizione |
---|---|---|
timeoutInMillis | Integer | tempo di attesa in millisecondi per l'acquisizione del blocco |
Ritorni
Boolean
: true se il blocco è stato acquisito, altrimenti false
waitLock(timeoutInMillis)
Tentativi di acquisizione del blocco, timeout con un'eccezione dopo il numero di millisecondi specificato. Questo metodo è uguale a tryLock(timeoutInMillis)
, ma genera un'eccezione quando non è possibile acquisire il blocco anziché restituire false.
var lock = LockService.getScriptLock(); try { lock.waitLock(10000); } catch (e) { Logger.log('Could not obtain lock after 10 seconds.'); }
Parametri
Nome | Tipo | Descrizione |
---|---|---|
timeoutInMillis | Integer | tempo di attesa in millisecondi per l'acquisizione del blocco |
Tiri
Error
: se il metodo è scaduto prima dell'acquisizione del blocco.