Class Lock

Замок

Представление блокировки взаимного исключения.

Этот класс позволяет сценариям гарантировать, что только один экземпляр сценария одновременно выполняет заданный раздел кода. Это особенно полезно для обратных вызовов и триггеров, когда действие пользователя может вызвать изменения в общем ресурсе, и вы хотите убедиться в отсутствии конфликтов.

В следующем примере показано, как использовать блокировку в обработчике отправки формы.

// 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);
}
Без службы блокировки, если два пользователя отправляют форму примерно в одно и то же время, номера заявок могут оказаться одинаковыми, поскольку свойство lastTicketNumber может измениться после того, как оно было прочитано из ScriptProperties , но до того, как новое значение было записано обратно. .

Методы

Метод Тип возврата Краткое описание
hasLock() Boolean Возвращает true, если блокировка была получена.
releaseLock() void Снимает блокировку, позволяя продолжить работу другим процессам, ожидающим блокировки.
tryLock(timeoutInMillis) Boolean Пытается получить блокировку, время ожидания истекает через указанное количество миллисекунд.
waitLock(timeoutInMillis) void Попытка получить блокировку, время ожидания с исключением истекает через указанное количество миллисекунд.

Подробная документация

hasLock()

Возвращает true, если блокировка была получена. Этот метод вернет false, если tryLock(timeoutInMillis) или waitLock(timeoutInMillis) никогда не вызывались, истекло время ожидания до получения блокировки или если был вызван releaseLock() .

var lock = LockService.getScriptLock();
lock.tryLock(10000);
if (!lock.hasLock()) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

Возвращаться

Boolean — true, если блокировка была получена, в противном случае — false.


releaseLock()

Снимает блокировку, позволяя продолжить работу другим процессам, ожидающим блокировки. Блокировка автоматически снимается при завершении выполнения сценария, но для эффективности лучше снять ее, как только вам больше не понадобится монопольный доступ к разделу кода. Этот метод не имеет эффекта, если блокировка не была получена.

Обратите внимание: если вы работаете с электронной таблицей, вам следует вызвать SpreadsheetApp.flush() перед снятием блокировки, чтобы зафиксировать все ожидающие изменения в электронной таблице, пока у вас еще есть монопольный доступ к ней.

var lock = LockService.getScriptLock();
lock.waitLock(10000);
// Do some work on a shared resource.
lock.releaseLock();

tryLock(timeoutInMillis)

Пытается получить блокировку, время ожидания истекает через указанное количество миллисекунд. Этот метод не имеет эффекта, если блокировка уже получена.

var lock = LockService.getScriptLock();
var success = lock.tryLock(10000);
if (!success) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

Параметры

Имя Тип Описание
timeoutInMillis Integer как долго ждать получения блокировки, в миллисекундах

Возвращаться

Boolean — true, если блокировка была получена, в противном случае — false.


waitLock(timeoutInMillis)

Попытка получить блокировку, время ожидания с исключением истекает через указанное количество миллисекунд. Этот метод аналогичен методу tryLock(timeoutInMillis) за исключением того, что он выдает исключение, когда блокировку невозможно получить, вместо возврата false.

var lock = LockService.getScriptLock();
try {
  lock.waitLock(10000);
} catch (e) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

Параметры

Имя Тип Описание
timeoutInMillis Integer как долго ждать получения блокировки, в миллисекундах

Броски

Error — если время ожидания метода истекло до того, как была получена блокировка.