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 de la secuencia de comandos ejecute una sección determinada de código a la vez. Esto es particularmente útil para las devoluciones de llamada y los activadores, en los que una acción del usuario puede causar cambios en un recurso compartido y deseas asegurarte de que no haya colisiones.

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 bloqueo, si dos usuarios envían el formulario aproximadamente al mismo tiempo, los números de ticket podrían terminar de la misma manera, ya que la propiedad lastTicketNumber podría cambiar después de que se haya leído desde ScriptProperties, pero antes de que se vuelva a escribir el valor nuevo.

Métodos

MétodoTipo de datos que se muestraDescripción breve
hasLock()BooleanMuestra true si se adquirió el bloqueo.
releaseLock()voidSuelta el bloqueo, lo que permite que otros procesos que esperan en la cerradura continúen.
tryLock(timeoutInMillis)BooleanIntentará adquirir el bloqueo y se agotará el tiempo de espera después de la cantidad proporcionada de milisegundos.
waitLock(timeoutInMillis)voidSe intenta adquirir el bloqueo y se agota el tiempo de espera, con una excepción después de la cantidad proporcionada de milisegundos.

Documentación detallada

hasLock()

Muestra true si se adquirió el bloqueo. Este método mostrará el valor "false" si nunca se llamó a tryLock(timeoutInMillis) o waitLock(timeoutInMillis), si se agotó el tiempo de espera antes de que se pudiera recuperar el bloqueo 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: Debe ser verdadero si se adquirió el bloqueo; de lo contrario, es falso.


releaseLock()

Suelta el bloqueo, lo que permite que otros procesos que esperan en la cerradura continúen. El bloqueo se libera automáticamente cuando finaliza la secuencia de comandos, pero para mayor eficiencia, es mejor hacerlo en cuanto 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 trabajas con una hoja de cálculo, debes llamar a SheetApp.flush() antes de liberar el bloqueo, para confirmar todos los cambios pendientes en la hoja de cálculo mientras tienes acceso exclusivo a ella.

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

tryLock(timeoutInMillis)

Intentará adquirir el bloqueo y se agotará el tiempo de espera después de la cantidad proporcionada de milisegundos. Este método no tiene 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 el bloqueo, en milisegundos

Volver

Boolean: Debe ser verdadero si se adquirió el bloqueo; de lo contrario, es falso.


waitLock(timeoutInMillis)

Se intenta adquirir el bloqueo y se agota el tiempo de espera, 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 un valor falso.

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 el bloqueo, en milisegundos

Arroja

Error, si se agotó el tiempo de espera del método antes de que se adquiriera el bloqueo