Class Lock

Bloquear

Es una 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 de código determinada a la vez. Esto es particularmente útil para las devoluciones de llamada y los activadores, en los que una acción del usuario puede provocar 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 formularios.

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

Métodos

MétodoTipo de datos que se devuelveDescripción breve
hasLock()BooleanDevuelve true si se adquirió el bloqueo.
releaseLock()voidLibera el bloqueo, lo que permite que continúen otros procesos que esperan el bloqueo.
tryLock(timeoutInMillis)BooleanIntenta adquirir el bloqueo y se agota el tiempo de espera después de la cantidad de milisegundos proporcionada.
waitLock(timeoutInMillis)voidIntenta adquirir el bloqueo y agota el tiempo de espera con una excepción después de la cantidad de milisegundos proporcionada.

Documentación detallada

hasLock()

Devuelve true si se adquirió el bloqueo. Este método devuelve 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().

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

Volver

Boolean: true si se adquirió el bloqueo; de lo contrario, false.


releaseLock()

Libera el bloqueo, lo que permite que continúen otros procesos que esperan el bloqueo. El bloqueo se libera automáticamente cuando finaliza la secuencia de comandos, pero, para mayor eficiencia, es mejor liberarlo en cuanto ya no necesites acceso exclusivo a una sección del 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 SpreadsheetApp.flush() antes de liberar el bloqueo para confirmar todos los cambios pendientes en la hoja de cálculo mientras aún tienes acceso exclusivo a ella.

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

tryLock(timeoutInMillis)

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

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

Parámetros

NombreTipoDescripción
timeoutInMillisIntegerTiempo de espera para adquirir el bloqueo, en milisegundos.

Volver

Boolean: true si se adquirió el bloqueo; de lo contrario, false.


waitLock(timeoutInMillis)

Intenta adquirir el bloqueo y agota el tiempo de espera con una excepción después de la cantidad de milisegundos proporcionada. Este método es igual a tryLock(timeoutInMillis), excepto que arroja una excepción cuando no se puede adquirir el bloqueo en lugar de devolver false.

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

Parámetros

NombreTipoDescripción
timeoutInMillisIntegerTiempo de espera para adquirir el bloqueo, en milisegundos.

Arroja

Error: Si el método agotó el tiempo de espera antes de que se adquiriera el bloqueo