gpt4 book ai didi

google-apps-script - 如何理解LockService并正确实现?

转载 作者:行者123 更新时间:2023-12-03 02:40:13 31 4
gpt4 key购买 nike

代码摘要

我有一个 Google Apps 脚本项目,特定域内有大约 80 个用户使用,但该应用是由我执行的(即 发布 > 部署为网络应用 > 执行应用程序:Me)。

该脚本的功能之一是从自定义表单(使用 HTML 服务)填充 Google 表格,然后通知我自己和提交用户(通过使用简单的登录系统和cookie)。

大约 6 个月以来一直运行良好,但有 1-2 次通知电子邮件已发送,但 Google 表格条目尚未出现。

我认为这可能是由于同时使用脚本造成的(因为两封通知电子邮件具有相同的时间戳)并且最近了解到 Lock Service

我使用这篇文章来确保我对 Lock 以及如何实现它有正确的理解,以防止由于并发脚本使用而条目不会出现在 Google 表格中。

实现

我的场景的伪代码是:

代码.gs

var active_spreadsheet = SpreadsheetApp.openById("bbb");

// BEGIN - start lock here

var lock = LockService.getScriptLock();
try {
lock.waitLock(30000); // wait 30 seconds for others' use of the code section and lock to stop and then proceed
} catch (e) {
Logger.log('Could not obtain lock after 30 seconds.');
}

var active_sheet = active_spreadsheet.getSheetByName("ENTRIES");
var new_start_row = active_sheet.getLastRow() + 1;

// Do lots of stuff - ie apply dynamic background colors based on previous entries colors, define the target range and set values, set data validations

SpreadsheetApp.flush(); // applies all pending spreadsheet changes
lock.releaseLock();

// END - end lock here

return;

问题

01)LockServicegetScriptLock()waitLock() 的实现releaseLock()正确吗?

02) 是否建议使用 SpreadsheetApp.flush(),如果是,上面的实现是否正确?

术语(供引用)

来自:https://developers.google.com/apps-script/reference/lock

Lock :
互斥锁的表示。

LockService :
防止并发访问代码部分。

Lock 类有 4 个方法:

hasLock()
Boolean,如果获得锁则返回 true。

releaseLock()
void,释放锁,允许等待锁的其他进程继续。

tryLock(timeoutInMillis)
bool 值,尝试获取锁,在提供的毫秒数后超时。

waitLock(timeoutInMillis)
void,尝试获取锁,在提供的毫秒数后超时并出现异常。

LockService 类有 3 个方法:

getDocumentLock()
Lock,获取一个锁,防止当前文档的任何用户同时运行一段代码。

getScriptLock()
Lock,获取一个锁,防止任何用户同时运行一段代码。

getUserLock()
Lock,获取阻止当前用户同时运行一段代码的锁。

最佳答案

在上面的伪代码中,一旦脚本没有获得锁定,它仍然会继续运行代码。这是预期的行为吗?向用户抛出服务器繁忙消息是更好的做法或选择。就像这样:

var active_spreadsheet = SpreadsheetApp.openById("bbb");

// BEGIN - start lock here

var lock = LockService.getScriptLock();
try {
lock.waitLock(30000); // wait 30 seconds for others' use of the code section and lock to stop and then proceed
} catch (e) {
Logger.log('Could not obtain lock after 30 seconds.');
return HtmlService.createHtmlOutput("<b> Server Busy please try after some time <p>")
// In case this a server side code called asynchronously you return a error code and display the appropriate message on the client side
return "Error: Server busy try again later... Sorry :("
}

// note: if return is run in the catch block above the following will not run as the function will be exited

var active_sheet = active_spreadsheet.getSheetByName("ENTRIES");
var new_start_row = active_sheet.getLastRow() + 1;

// Do lots of stuff - ie apply dynamic background colors based on previous entries colors, define the target range and set values, set data validations

SpreadsheetApp.flush(); // applies all pending spreadsheet changes
lock.releaseLock();

// END - end lock here

return;

关于google-apps-script - 如何理解LockService并正确实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43223774/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com