You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:45:38