【问题标题】:Google App Script and public locks谷歌应用脚​​本和公共锁
【发布时间】:2018-03-26 23:13:13
【问题描述】:

我有一个电子表格,我有一个doGet() 和一个doPost() 以及一个定时触发器来进行一些更新。我希望这些相互阻止。耶,LockService……希望如此。

LockService 上的 Google 文档没有记录 getPublicLock() 方法,我似乎找不到任何特定于我需要的东西。上面的文档确实说getDocumentLock() 将在不是特别有用的网络应用程序中返回null,并且互联网上的一般帖子表明它将停止同时运行一些代码......这不是什么我想要。我想要的是在更新数据时停止对数据的请求。

我已尝试对其进行测试,但我似乎无法让脚本运行足够长的时间来令我满意。

如果我使用:

var lock = LockService.getPublicLock();
lock.waitLock(30000);

在所有 3 个入口点中,当调用任何其他调用时,脚本是否会成功锁定?

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    我没有在 Google-Apps-Script 中遇到 LockService.getPublicLock()。

    但是 LockService.getScriptLock() 应该可以工作。正如文档所述:

    获取阻止任何用户同时运行一段代码的锁。无论用户的身份如何,由脚本锁保护的代码段都不能同时执行。请注意,在调用 Lock.tryLock(timeoutInMillis) 或 Lock.waitLock(timeoutInMillis) 之前,不会真正获取锁。

    我特别在 Web App 中使用过它,并且据我测试,它按承诺工作:

    虽然使用该应用程序的任何人都在脚本中保留了一个脚本锁,但对于任何用户,脚本锁锁定的任何其他块都不会执行。

    我会将此添加为评论,但我还没有评论的权利..

    【讨论】:

    • 由脚本锁保护的代码段不能同时执行——我不希望这样。我不想运行任何代码,而不是一个部分。
    • 哦,我明白了。如果我错了,请纠正我,但使用这样的东西不能解决这个问题: function doGet(e) { var lock = LockService.getScriptLock(); var 成功 = lock.tryLock(10000);如果(!成功){返回; } } 而且因为它的格式很糟糕:你不能通过尝试获取锁来启动 doGet 和 doPost 并在它被保留的情况下返回 -> 这样任何用户在更新时都无法请求数据。
    • 这也是我的问题的基础:) 文档说它阻止了一段代码。 doGet() 和 doPost() 是不同的代码。我可以编写一个所有输入点都调用的通用锁定函数,该函数返回锁定以供稍后释放,但如果脚本按我的需要阻塞,则不需要。
    • 啊,对。很抱歉无法理解您的问题。我认为现在很清楚:)
    • 很抱歉按回车太快了.. :) 所以脚本锁阻止了当前脚本中脚本锁锁定的每一位代码(如果我听起来再愚蠢的话)。所以是的,所有的 App Script Lock(据我所知)只是阻塞部分,所以基本上你只是在代码的最开始调用锁,但是这样你无论如何都可以阻塞它。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多