Google应用程序引擎任务队列 - 仅允许一个项目

时间:2016-07-11 00:38:19

标签: google-app-engine

推送队列我有这个奇怪的问题。

我只需要从此队列中一次运行一个任务。我已经配置了一个推送队列,其中max-concurrent-requests设置为1.但是当我将任务提交到队列时,它们最终会并行运行。我不得不将速率降低到每分钟1次。但如果我的任务需要超过1分钟,会发生什么?他们两个将并行运行。

<queue>
    <name>winCoinsCalculatorQueue</name>
    <max-concurrent-requests>1</max-concurrent-requests>
    <rate>1/m</rate>
</queue>

我也试过1但它似乎仍然并行处理多个项目。

任何人都知道如何让队列一次只允许处理一个任务?

阿伦

2 个答案:

答案 0 :(得分:0)

首先,即使您实现了一次只运行一个任务的机制,但任务之间的间隔比任务运行时间短,您的任务队列也会过多。也就是说,我看到了两种可能的解决方案。

解决方案一 - 动作令牌。创建一个数据存储条目,用于指示是否正在运行任务。现在,当每个任务开始运行时,它会检查数据库,查看另一个任务是否正在运行,如果另一个任务正在运行,则将当前任务排入队列以在N秒内重试(使用countdown参数:taskqueue.add(url='/tasks/your_task', countdown=delay_in_seconds, params=params))(请注意,你必须在这里找到一种处理竞争条件的方法)

解决方案二 - 使用拉动队列和每N秒运行一次的cron作业,再次使用操作令牌。每次玉米作业运行时,它都会检查是否有任务正在运行,如果是,则cron不执行任何操作。如果没有任务正在运行,则会在DB中设置运行标志。当任务完成时,它将取消设置。

答案 1 :(得分:0)

这是防止任务同时运行的好方法。您的一条评论表明您只在开发服务器上进行了测试。 The dev server does not respect some of the task queue settings.在生产中试用它,它应该有用。

您可以通过确保您的任务需要很长时间才能完成,然后排队等等来验证这一点。转到项目的控制台,在App Engine下查看 - &gt;任务队列,然后单击您的队列名称。你会看到有多少人正在运行。