Представление блокировки взаимного исключения.
Этот класс позволяет сценариям гарантировать, что только один экземпляр сценария одновременно выполняет заданный раздел кода. Это особенно полезно для обратных вызовов и триггеров, когда действие пользователя может вызвать изменения в общем ресурсе, и вы хотите убедиться в отсутствии коллизий.
В следующем примере показано, как использовать блокировку в обработчике отправки формы.
// 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
может измениться после того, как оно было прочитано из Script Properties
но до того, как новое значение было записано обратно. . Методы
Метод | Тип возврата | Краткое описание |
---|---|---|
has Lock() | Boolean | Возвращает true, если блокировка была получена. |
release Lock() | void | Снимает блокировку, позволяя продолжить работу другим процессам, ожидающим блокировки. |
try Lock(timeoutInMillis) | Boolean | Пытается получить блокировку, время ожидания истекает через указанное количество миллисекунд. |
wait Lock(timeoutInMillis) | void | Попытка получить блокировку, время ожидания с исключением истекает через указанное количество миллисекунд. |
Подробная документация
has Lock()
Возвращает true, если блокировка была получена. Этот метод вернет значение false, если try Lock(timeoutInMillis)
или wait Lock(timeoutInMillis)
никогда не вызывалась, истекло время ожидания до получения блокировки или если был вызван release Lock()
.
const lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
Возвращаться
Boolean
— true, если блокировка была получена, в противном случае — false.
release Lock()
Снимает блокировку, позволяя продолжить работу другим процессам, ожидающим блокировки. Блокировка автоматически снимается при завершении выполнения сценария, но для эффективности лучше снять ее, как только вам больше не понадобится монопольный доступ к разделу кода. Этот метод не имеет эффекта, если блокировка не была получена.
Обратите внимание: если вы работаете с электронной таблицей, вам следует вызвать SpreadsheetApp.flush() перед снятием блокировки, чтобы зафиксировать все ожидающие изменения в электронной таблице, пока у вас еще есть монопольный доступ к ней.
const lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
try Lock(timeoutInMillis)
Пытается получить блокировку, время ожидания истекает через указанное количество миллисекунд. Этот метод не имеет эффекта, если блокировка уже получена.
const lock = LockService.getScriptLock(); const success = lock.tryLock(10000); if (!success) { Logger.log('Could not obtain lock after 10 seconds.'); }
Параметры
Имя | Тип | Описание |
---|---|---|
timeout In Millis | Integer | как долго ждать получения блокировки, в миллисекундах |
Возвращаться
Boolean
— true, если блокировка была получена, в противном случае — false.
wait Lock(timeoutInMillis)
Попытка получить блокировку, время ожидания с исключением истекает через указанное количество миллисекунд. Этот метод аналогичен методу try Lock(timeoutInMillis)
за исключением того, что он выдает исключение, когда блокировку невозможно получить, вместо возврата false.
const lock = LockService.getScriptLock(); try { lock.waitLock(10000); } catch (e) { Logger.log('Could not obtain lock after 10 seconds.'); }
Параметры
Имя | Тип | Описание |
---|---|---|
timeout In Millis | Integer | как долго ждать получения блокировки, в миллисекундах |
Броски
Error
— если время ожидания метода истекло до того, как была получена блокировка.