google 应用程序脚本中的 LockService 的 Lock 是可重入的还是不可重入的?
Is the Lock by the LockService in google app script reentrant or non-reentrant?
我正在尝试为 google 工作表实施简单的行级锁定。 (意识到并发访问会破坏数据。我只是偏执吗?)。我遇到了 LockService 并计划使用它,但只是好奇它是哪种锁。
答案:
LockService
是互斥锁,如果用于保护脚本外部数据,例如不使用用户特定属性的 PropertiesService
方法, 允许代码重入。
LockService
提供的Lock可以多次申请而不会阻塞自己。
更多信息:
LockService
包含一个 Lock
class,它代表 mutual-exclusion 锁。
来自文档:
Class Lock
A representation of a mutual-exclusion lock.
This class allows scripts to make sure that only one instance of the script is executing a given section of code at a time. This is particularly useful for callbacks and triggers, where a user action may cause changes to a shared resource and you want to ensure that aren't collisions.
文档页面上给出的示例似乎已过时 [1],但是该示例仍然显示了如果遵守以下规则如何实现重新进入:
- 脚本中只使用局部变量
- 任何具有全局范围的变量(在 Apps 脚本的情况下,
PropertiesService
属性)必须锁定在互斥锁中。
- 任何 read/write 脚本中包含的内容之外的数据方法(工作表数据、可修改的表单响应等)都必须锁定在互斥锁中。
在编辑 Sheets 的情况下,SpreadsheetApp.flush()
方法足以适用于大多数操作,前提是它们在不包含很多编辑的脚本中以高频率密度使用 - 任何复杂度更高的算法比 O(1) [2] 对于 Sheets 编辑需要间隔 flush()
以获得高可靠性,只要没有大的值或结构编辑sheet.
如果您有严重的并发执行问题,请考虑自己是否需要添加 2-3 SpreadsheetApp.flush()
行的盈余,或者具有足够大的外部 read/write 算法复杂度(O(N) 或更高),那么 Lock 将是首选。
备注:
1. ScriptProperties
已被弃用,取而代之的是 PropertiesService
方法
2。或者 O(N)
对于非常小的 N,当且仅当 代码行不读取或写入大数据集时
参考文献:
- Lock Service | Apps Script | Google Developers
- Class
Lock
| Apps Script | Google Developers
- Mutual exclusion - Wikipedia
- Properties Service | Apps Script | Google Developers
- Class
SpreadsheetApp
- flush()
method
- S. Iyer and P. Gupta, Embedded Realtime Systems Programming, New York, Tata McGraw-Hill Education, 2003, p. 127
相关问题:
我正在尝试为 google 工作表实施简单的行级锁定。 (意识到并发访问会破坏数据。我只是偏执吗?)。我遇到了 LockService 并计划使用它,但只是好奇它是哪种锁。
答案:
LockService
是互斥锁,如果用于保护脚本外部数据,例如不使用用户特定属性的 PropertiesService
方法, 允许代码重入。
LockService
提供的Lock可以多次申请而不会阻塞自己。
更多信息:
LockService
包含一个 Lock
class,它代表 mutual-exclusion 锁。
来自文档:
Class Lock
A representation of a mutual-exclusion lock.
This class allows scripts to make sure that only one instance of the script is executing a given section of code at a time. This is particularly useful for callbacks and triggers, where a user action may cause changes to a shared resource and you want to ensure that aren't collisions.
文档页面上给出的示例似乎已过时 [1],但是该示例仍然显示了如果遵守以下规则如何实现重新进入:
- 脚本中只使用局部变量
- 任何具有全局范围的变量(在 Apps 脚本的情况下,
PropertiesService
属性)必须锁定在互斥锁中。 - 任何 read/write 脚本中包含的内容之外的数据方法(工作表数据、可修改的表单响应等)都必须锁定在互斥锁中。
在编辑 Sheets 的情况下,SpreadsheetApp.flush()
方法足以适用于大多数操作,前提是它们在不包含很多编辑的脚本中以高频率密度使用 - 任何复杂度更高的算法比 O(1) [2] 对于 Sheets 编辑需要间隔 flush()
以获得高可靠性,只要没有大的值或结构编辑sheet.
如果您有严重的并发执行问题,请考虑自己是否需要添加 2-3 SpreadsheetApp.flush()
行的盈余,或者具有足够大的外部 read/write 算法复杂度(O(N) 或更高),那么 Lock 将是首选。
备注:
1. ScriptProperties
已被弃用,取而代之的是 PropertiesService
方法
2。或者 O(N)
对于非常小的 N,当且仅当 代码行不读取或写入大数据集时
参考文献:
- Lock Service | Apps Script | Google Developers
- Class
Lock
| Apps Script | Google Developers - Mutual exclusion - Wikipedia
- Properties Service | Apps Script | Google Developers
- Class
SpreadsheetApp
-flush()
method - S. Iyer and P. Gupta, Embedded Realtime Systems Programming, New York, Tata McGraw-Hill Education, 2003, p. 127