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

  // Get a script lock, because we're about to modify a shared resource.
  var lock = LockService.getScriptLock();
  // Wait for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  var ticketNumber = Number(ScriptProperties.getProperty('lastTicketNumber')) + 1;
  ScriptProperties.setProperty('lastTicketNumber', ticketNumber);

  // Release the lock so that other processes can continue.
  lock.releaseLock();

  targetCell.setValue(ticketNumber);
}
Без LockService, если два пользователя отправят форму примерно в одно и то же время, номера билетов могут оказаться одинаковыми, поскольку свойство 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 — если время ожидания метода истекло до получения блокировки