Google Sheets中LockService行为疑问:函数并发控制问题
Google Apps Script 锁机制问题解答
你当前的代码如下:
function import() { const lock = LockService.getUserLock(); lock.tryLock(5000); if (lock.hasLock()) { // do stuff sort(); // call the sort function // do more stuff lock.releaseLock(); } } function sort() { const lock = LockService.getUserLock(); lock.tryLock(5000); if (lock.hasLock()) { // do some other stuff lock.releaseLock(); } } function fixDates() { const lock = LockService.getUserLock(); lock.tryLock(5000); if (lock.hasLock()) { // do more stuff lock.releaseLock(); } }
针对你的两个疑问,解答如下:
1. import()中的锁与sort()中的锁是同一个还是完全独立的?
是同一个锁实例。LockService.getUserLock()获取的是当前用户在当前脚本范围内的专属锁——不管在哪个函数里调用这个方法,只要是同一个用户执行同一份脚本,拿到的都是同一个锁对象。
另外这个锁支持重入:当import()已经持有锁时,内部调用的sort()再去尝试获取锁会直接成功,不会阻塞自身执行,因为锁的持有者就是当前运行的脚本线程。
2. 先点击Import按钮,紧接着点击Sort按钮,手动触发的sort()是否会在import()执行完毕后才运行?
是的,执行顺序为import() → 内部调用sort() → 手动触发sort()。
点击Import后,import()会获取到用户锁并开始执行;此时手动触发的sort()尝试获取同一个锁,但锁已被import()持有,所以它会进入等待状态(最长等待你设置的5000毫秒),直到import()执行完所有逻辑并调用lock.releaseLock()释放锁后,手动触发的sort()才能获取锁并启动执行。
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

