推送队列我有这个奇怪的问题。
我只需要从此队列中一次运行一个任务。我已经配置了一个推送队列,其中max-concurrent-requests设置为1.但是当我将任务提交到队列时,它们最终会并行运行。我不得不将速率降低到每分钟1次。但如果我的任务需要超过1分钟,会发生什么?他们两个将并行运行。
<queue>
<name>winCoinsCalculatorQueue</name>
<max-concurrent-requests>1</max-concurrent-requests>
<rate>1/m</rate>
</queue>
我也试过1但它似乎仍然并行处理多个项目。
任何人都知道如何让队列一次只允许处理一个任务?
阿伦
答案 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;任务队列,然后单击您的队列名称。你会看到有多少人正在运行。