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,当且仅当 代码行不读取或写入大数据集时

参考文献:


相关问题: