Rappresentazione di un blocco di mutua esclusione.
Questa classe consente agli script di assicurarsi che solo un'istanza dello script esegua una determinata sezione di codice alla volta. Ciò è particolarmente utile per i callback e i trigger, in cui l'azione di un utente potrebbe causare modifiche a una risorsa condivisa e vuoi assicurarti che non si verifichino conflitti.
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) { 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); }
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 il blocco è stato acquisito. |
release | void | Rilascia il blocco, consentendo ad altri processi in attesa del blocco di continuare. |
try | Boolean | Tenta di acquisire il blocco, con timeout dopo il numero di millisecondi fornito. |
wait | void | Tenta di acquisire il blocco, con timeout con un'eccezione dopo il numero di millisecondi fornito. |
Documentazione dettagliata
has Lock()
Restituisce true se il blocco è stato acquisito. Questo metodo restituisce false se try o wait non sono mai stati chiamati, se si è verificato il timeout prima che il blocco potesse essere recuperato
o se è stato chiamato release.
const lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
Indietro
Boolean - true se il blocco è stato acquisito, false altrimenti.
release Lock()
Rilascia il blocco, consentendo ad altri processi in attesa del blocco di continuare. Il blocco viene rilasciato automaticamente al termine dello script, ma per 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 lavori con un foglio di lavoro, devi chiamare SpreadsheetApp.flush() prima di rilasciare il blocco, per applicare tutte le modifiche in attesa al 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 timeout dopo il numero di millisecondi fornito. Questo metodo non ha effetto se il blocco è già stato acquisito.
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 | Tempo di attesa per acquisire il blocco, in millisecondi. |
Indietro
Boolean - true se il blocco è stato acquisito, false altrimenti.
wait Lock(timeoutInMillis)
Tenta di acquisire il blocco, con timeout con un'eccezione dopo il numero di
millisecondi fornito. 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 | Tempo di attesa per acquisire il blocco, in millisecondi. |
Genera
Error: se il metodo è scaduto prima dell'acquisizione del blocco