Class Lock

Blocca

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

MetodoTipo restituitoBreve descrizione
hasLock()BooleanRestituisce true se il blocco è stato acquisito.
releaseLock()voidRilascia il blocco, consentendo agli altri processi in attesa sul blocco di continuare.
tryLock(timeoutInMillis)BooleanTentativi di acquisizione del blocco, timeout dopo il numero di millisecondi specificato.
waitLock(timeoutInMillis)voidTentativi 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

NomeTipoDescrizione
timeoutInMillisIntegertempo 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

NomeTipoDescrizione
timeoutInMillisIntegertempo di attesa in millisecondi per l'acquisizione del blocco

Tiri

Error: se il metodo è scaduto prima dell'acquisizione del blocco.