Class Lock

Bloquear

Representación de un bloqueo de exclusión mutua.

Esta clase permite que las secuencias de comandos se aseguren de que solo una instancia ejecute una determinada secuencia de comandos. sección de código a la vez. Esto es particularmente útil para devoluciones de llamada y activadores, en los que un usuario acción podría provocar cambios en un recurso compartido, y quieres asegurarte de que no haya de conflictos.

En el siguiente ejemplo, se muestra cómo usar un bloqueo en un controlador de envío de formulario.

// 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);
}
Sin el servicio de cerradura, si dos usuarios envían el formulario aproximadamente al mismo tiempo, el ticket números podrían terminar iguales, ya que la propiedad lastTicketNumber podría cambiar después de se leyó desde el ScriptProperties, pero antes de que se volviera a escribir el valor nuevo.

Métodos

MétodoTipo de datos que se muestraDescripción breve
hasLock()BooleanMuestra el valor true si se adquirió el bloqueo.
releaseLock()voidLibera el candado para permitir otros procesos que esperan en él para continuar.
tryLock(timeoutInMillis)BooleanIntenta adquirir el bloqueo, y el tiempo de espera se agota después de la cantidad de milisegundos proporcionada.
waitLock(timeoutInMillis)voidIntentos de adquisición del bloqueo, tiempo de espera agotado con una excepción después de la cantidad proporcionada de milisegundos.

Documentación detallada

hasLock()

Muestra el valor true si se adquirió el bloqueo. Este método mostrará el valor "false" si tryLock(timeoutInMillis) o Nunca se llamó a waitLock(timeoutInMillis), se agotó el tiempo de espera antes de poder recuperar la cerradura o si se llamó a releaseLock().

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

Volver

Boolean: Es verdadero si se adquirió el bloqueo. De lo contrario, es falso.


releaseLock()

Libera el candado para permitir otros procesos que esperan en él para continuar. La cerradura es se publican automáticamente cuando finaliza la secuencia de comandos, pero para mejorar la eficiencia, es mejor lanzarla cuando ya no necesites acceso exclusivo a una sección de código. Este método no tiene efecto si no se adquirió el bloqueo.

Ten en cuenta que si estás trabajando con una hoja de cálculo, debes llamar a SpreadsheetApp.flush() antes de retirar el bloqueo, para confirmar todos los cambios pendientes en la hoja de cálculo, mientras tengan acceso exclusivo a ellos.

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

tryLock(timeoutInMillis)

Intenta adquirir el bloqueo, y el tiempo de espera se agota después de la cantidad de milisegundos proporcionada. Este método no tendrá efecto si ya se adquirió el bloqueo.

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

Parámetros

NombreTipoDescripción
timeoutInMillisIntegercuánto tiempo esperar para adquirir la cerradura (en milisegundos)

Volver

Boolean: Es verdadero si se adquirió el bloqueo. De lo contrario, es falso.


waitLock(timeoutInMillis)

Intentos de adquisición del bloqueo, tiempo de espera agotado con una excepción después de la cantidad proporcionada de milisegundos. Este método es el mismo que tryLock(timeoutInMillis), excepto que arroja una excepción cuando no se puede adquirir el bloqueo, en lugar de mostrar false.

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

Parámetros

NombreTipoDescripción
timeoutInMillisIntegercuánto tiempo esperar para adquirir la cerradura (en milisegundos)

Arroja

Error: Se agotó el tiempo de espera del método antes de adquirir el bloqueo.