首页 > 解决方案 > Apps 脚本 - 在脚本的不同部分实现多个锁定

问题描述

我试图限制同一脚本的不同部分同时使用应用程序脚本,但无论我做什么,一个锁都会锁定整个事情。这是我的示例脚本:

function lockTest(event) {
  var r_eventRange = event.range;
  var value = r_eventRange.getValue();
  
  if (value == "A"){
    var lock1 = LockService.getScriptLock();
    lock1.waitLock(10000);
    //do stuff
    lock1.releaseLock();
  } else if (value == "B") {
    var lock2 = LockService.getScriptLock();
    lock2.waitLock(10000);
    //do different stuff
    lock2.releaseLock();
  }
}

函数“lockTest”由 onEdit 事件触发。此脚本的目的是可以有两个值:“A”和“B”。如果我连续接到两个都有value“A”的呼叫,那么强制呼叫等待一次执行一个。如果我连续接到两个都有value“B”的电话,同样的事情。但是,如果我接到连续的电话,其中value一个是“A”,另一个是“B”,那么继续让代码连续运行而无需等待。

但是,使用此脚本,“锁定服务”将不允许连续运行,无论value. 换句话说,如果第一个调用具有value“A”,而第二个调用在第一个调用完成之前出现,但它value是“B”,则锁定服务会强制第二个调用等待第一个调用完成,即使锁定应该是不同的。

是否可以控制脚本不同部分的锁定?


基本上,我需要value“A”来触发lock1编辑一组特定的共享资源。 value“B”应该触发lock2编辑一组完全不同的共享资源lock1。这意味着lock1并且lock2应该能够同时运行,因为他们编辑的资源完全不同。事实上,我需要它们同时运行,因为lock1触发频率要高得多lock2,并且lock1只需要大约 2 秒即可执行。 lock2触发频率要低得多,但执行需要 30-150 秒。因此lock1,即使已经在运行,我也需要能够lock2运行,否则lock1会超时或者可能有很多实例lock1lock2在完成“锁定服务”将开始抛出错误时排队等待。

有趣的是,如果我在 if() 语句之前放置一个记录器,我会在每次发生编辑事件时立即获取日志——这意味着“锁定服务”仅锁定 if 语句而不是它之前的行。

谷歌的“锁定服务”文档说

getScriptLock() 获取一个锁,以防止任何用户同时运行一段代码。无论用户的身份如何,由脚本锁保护的代码段都不能同时执行。

由此看来,我们应该能够锁定特定的代码部分。我只是不知道如何指定这些单独的部分是什么。我假设该releaseLock()方法会告诉它在哪里结束该部分。也许确实如此 - 我担心“锁服务”不支持指定多个独立锁,这正是我需要的。


根据奥列格的建议:

function lockTest(event) {
  var r_eventRange = event.range;
  var value = r_eventRange.getValue();
  
  if (value == "A"){
    checkFormatting();
  } else {
    doAction();
  }
}

function checkFormatting(){
  var lock1 = LockService.getScriptLock();
  lock1.waitLock(10000);
  //do stuff
  lock1.releaseLock();
}

function doAction(){
  var lock2 = LockService.getScriptLock();
  lock2.waitLock(10000);
  //do different stuff
  lock2.releaseLock();
}

不幸的是,我在上面的代码中遇到了同样的问题。

标签: google-apps-scriptlocking

解决方案


我和你有同样的问题。似乎由提供的锁LockService是单例的,因此无论lock.waitLock()最初在哪里获取锁,您的调用都将始终等待。

我建议您查看这个提供“命名锁”的库,这正是您在此处寻找的。还没用过,但看起来很有希望。

https://ramblings.mcpher.com/gassnippets2/using-named-locks-with-google-apps-scripts/


推荐阅读