google-apps-script - 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
会超时或者可能有很多实例lock1
lock2
在完成“锁定服务”将开始抛出错误时排队等待。
有趣的是,如果我在 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();
}
不幸的是,我在上面的代码中遇到了同样的问题。
解决方案
我和你有同样的问题。似乎由提供的锁LockService
是单例的,因此无论lock.waitLock()
最初在哪里获取锁,您的调用都将始终等待。
我建议您查看这个提供“命名锁”的库,这正是您在此处寻找的。还没用过,但看起来很有希望。
https://ramblings.mcpher.com/gassnippets2/using-named-locks-with-google-apps-scripts/
推荐阅读
- python - 如果它在 PySide2 中,玛雅无法识别 unicode?
- loops - 如何在本机反应中嵌套循环?
- java - JFreeChart:当时间轴减少时如何缩放 Y 轴?
- html - 将导航栏从内联列表转换为移动版网站的块类型列表 - 缺少项目符号
- c# - 如何将文本块的大小调整为等宽字体和分辨率
- excel - 导出 Datagridview 数据以访问数据库
- docker - 在 Bitbucket Pipeline 中,如何使用新生成的 Docker 镜像动态检测和启动容器
- java - @RequestMapping 和 @PostMapping 有什么区别
- debugging - 如何在 Visual Studio Code 中调试外部库代码?
- python - 导出数据框时如何修复“生成器”对象没有属性“to_csv”