Google apps script 我可以跨两个功能使用锁服务吗?
声明我可以锁定对一段代码的访问,但是如果有两个函数访问我的电子表格中的同一个工作表,则使用 有没有办法阻止两个函数同时访问该工作表 现在,我的工作是通过Properties服务设置和取消设置脚本属性:Google apps script 我可以跨两个功能使用锁服务吗?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,声明我可以锁定对一段代码的访问,但是如果有两个函数访问我的电子表格中的同一个工作表,则使用 有没有办法阻止两个函数同时访问该工作表 现在,我的工作是通过Properties服务设置和取消设置脚本属性: { 'lock': True } 当然,这里的问题是,如果我的一个函数中途失败,锁状态将永久存在 编辑 应评论员的要求,这里有一些关于这两个函数的伪代码 SHEET = SpreadsheetApp.getActive.getSheetByName('Sheet 1') // clock
{
'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
。(可能还有其他可能的问题)。方法
在并发访问共享资源期间,您可以使用应用程序脚本锁定服务来防止竞争条件
下面是两个函数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的锁行为
参考:
这两个函数是如何调用的?请您发布函数代码好吗?@Alessandro我添加了一些代码谢谢。我没有意识到锁的作用范围比当前的功能更广。