Class Lock

Замок

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

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

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

// 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 — если время ожидания метода истекло до того, как была получена блокировка.