google-apps-script - 我可以跨两个函数使用 LockService 吗?
问题描述
LockService 文档指出我可以锁定对一段代码的访问,但是如果有两个函数可以访问我的电子表格中的同一张工作表?
有没有办法阻止两个函数同时访问该表?
现在我的工作是通过属性服务设置和取消设置脚本属性:
{
'lock': True
}
当然,这里的问题是,如果我的一个功能在中途失败,锁定状态将永久存在。
编辑
应评论者的要求,这里是有问题的两个函数的一些伪代码
SHEET = SpreadsheetApp.getActive.getSheetByName('Sheet 1')
// clock trigger to run this once every 5 minutes
function funcA() {
range = SHEET.getRange('C2:E')
vals = range.getValues();
updatedVals = doSomeProcessing(vals);
range.setValues(vals);
}
// clock trigger to run this once every 6 hours
function funcB() {
range = SHEET.getRange('A2:Z')
vals = range.getValues();
updateVals = doSomeOtherProcessing(vals);
range.setValues(vals);
sheet.sort(1);
}
所以问题是如果funcA
从 读取SHEET
,然后funcB
排序,然后funcA
写回SHEET
. (并且可能还有其他可能的问题)。
解决方案
方法
在并发访问共享资源期间,您可以使用 Apps Script LockService 来防止竞争条件。
这里有一个简单的例子,你的两个函数funcA
和funcB
:
// this function takes 10 seconds to run, waits 5 seconds for the lock to be released otherwise it fails.
function funcA() {
var lock = LockService.getScriptLock(); // gets the lock from the LockService
try {
lock.waitLock(5000); // Tries for at most 5 seconds to get the lock
Utilities.sleep(10000);
} catch (e) {
Logger.log('funcA could not obtain lock after 5 seconds.');
}
}
// this functions takes 20 seconds to run, waits 5 seconds for the lock to be released otherwise it fails.
function funcB() {
var lock = LockService.getScriptLock();
try {
lock.waitLock(5000);
Utilities.sleep(20000);
} catch (e) {
Logger.log('funcB could not obtain lock after 5 seconds.');
}
}
您可以轻松地尝试在函数 B 之后调用函数 A 的锁定行为。
参考:
推荐阅读
- javascript - 如何使用 Javascript 从 GridView 单元格中获取值
- jquery - 轮播事件未触发
- c++ - 与结构一起使用时的 MSVC 列表初始化 ICE?
- node.js - 生产和module.parent中的多个实例的Nodejs问题
- android - Firebase 会将我的崩溃数据存储多长时间?/ 从 Crashlytics 导出数据?
- r - 如何在 R 中将四列融合在一起
- r - R,如何仅替换数据框的数值?
- c++ - 找出两个向量之间的差异
- javascript - Javascript中的空白字符串是真还是假?
- graph - 组计数查询会因大数据而失败吗?Amazon Neptune 图形数据库