- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
代码摘要
我有一个 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) 是 LockService
、getScriptLock()
、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/
在 LockService 文档中:https://developers.google.com/apps-script/service_lock它声明“getPublicLock() - 获取一个锁,
我正在尝试避免在我的项目中使用 LockService 进行并发处理。 在测试运行中,LockService 对我来说没有任何问题。 但是当我推出我的项目时,有时 LockService 似乎无法正常
我有一个公共(public)插件,它利用 Google Apps 脚本锁定服务来防止在写入之前读取电子表格。 var lock = LockService.getDocumentLock(); var
我是一名优秀的程序员,十分优秀!