Class Lock

Blocca

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à lastTicketNumber potrebbe cambiare dopo essere stata letta da ScriptProperties, ma prima che il nuovo valore venga riscritto.

Metodi

MetodoTipo restituitoBreve descrizione
hasLock()BooleanRestituisce true se la serratura è stata acquisita.
releaseLock()voidRilascia il blocco, consentendo ad altri processi in attesa di continuare.
tryLock(timeoutInMillis)BooleanTenta di acquisire il blocco, con un timeout dopo il numero di millisecondi specificato.
waitLock(timeoutInMillis)voidTenta di acquisire il blocco, generando un timeout con un'eccezione dopo il numero di millisecondi specificato.

Documentazione dettagliata

hasLock()

Restituisce true se la serratura è stata acquisita. Questo metodo restituirà false se tryLock(timeoutInMillis) o waitLock(timeoutInMillis) non sono mai stati chiamati, se è scaduto il tempo di attesa prima che fosse possibile recuperare la serratura o se è stato chiamato releaseLock().

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


releaseLock()

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();

tryLock(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

NomeTipoDescrizione
timeoutInMillisIntegeril tempo di attesa per acquisire il blocco, in millisecondi

Invio

Boolean: true se il blocco è stato acquisito, false in caso contrario


waitLock(timeoutInMillis)

Tenta di acquisire il blocco, generando un timeout con un'eccezione dopo il numero di millisecondi specificato. Questo metodo è uguale a tryLock(timeoutInMillis), 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

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