锁服务getScriptLock()在库中工作

时间:2014-11-04 11:42:53

标签: google-apps-script

我正在构建一个将由多个其他脚本使用的脚本库。这些脚本将同时运行,我需要控制对单个资源(电子表格)的访问。

文档对我来说并不完全清楚。 Class Lock示例引用LockService.getPublicLock();方法。但这种方法似乎不再存在。

要测试LockService我创建了一个具有获取锁的方法doTest的库:

this.doTest = function(testClient){     var lock = LockService.getScriptLock(),         成功;

try {
  lock.waitLock(1000);
  Logger.log(testClient + ' Obtained lock');
  Utilities.sleep(2000);
  lock.releaseLock();
} catch (e) {
  Logger.log(testClient + ' Could not obtain lock after 2 seconds.');
}

}

测试库用于另外两个测试脚本。如果我同时运行测试脚本,则两个脚本有时无法获取锁定。这正是我想要看到的。

但是,鉴于文档中的示例引用了另一种方法以及库在不同脚本中的用法,我想确定它是如何工作的。

所以问题是:脚本锁是否可以跨库工作,并且无论库是否在不同的脚本中使用,它都会锁定代码段。还有其他我应该担心的问题吗?

1 个答案:

答案 0 :(得分:3)

我相信你的假设是正确的:库中使用的Lock实例将由使用该库的所有脚本共享。至少这也是我的假设。

如果您查看Resource Scoping section of the Libraries page in Google Apps Script reference,然后向下滚动到共享和非共享资源表,您将看到Lock是非共享资源,已解释在表格脚注中作为

  

这意味着库拥有自己的资源/功能实例以及所有实例   使用库共享的脚本,并且可以访问该共享   实例

我必须说,Resource Scoping部分的措辞相当令人困惑,' ' '非共享&#39 ; 概念没有得到很好的解释。但它的要点是:只要你的Lock在库代码中创建,所有使用该库的脚本都将访问锁的同一个实例。