Google app engine Google应用程序引擎任务队列-仅允许一项
我对推送队列有一个奇怪的问题 我一次只需要从这个队列运行一个任务。我已将最大并发请求设置为1的推送队列配置。但当我将任务提交到队列时,它们最终会并行运行。我不得不将速率降低到每分钟1次。但是,如果我的任务耗时超过1分钟,会发生什么?他们两个将并行运行Google app engine Google应用程序引擎任务队列-仅允许一项,google-app-engine,Google App Engine,我对推送队列有一个奇怪的问题 我一次只需要从这个队列运行一个任务。我已将最大并发请求设置为1的推送队列配置。但当我将任务提交到队列时,它们最终会并行运行。我不得不将速率降低到每分钟1次。但是,如果我的任务耗时超过1分钟,会发生什么?他们两个将并行运行 <queue> <name>winCoinsCalculatorQueue</name> <max-concurrent-requests>1</max-concurrent-r
<queue>
<name>winCoinsCalculatorQueue</name>
<max-concurrent-requests>1</max-concurrent-requests>
<rate>1/m</rate>
</queue>
WincoinScalatorQueue
1.
1/m
我也尝试了1,但它似乎仍然并行处理多个项目
<queue>
<name>winCoinsCalculatorQueue</name>
<max-concurrent-requests>1</max-concurrent-requests>
<rate>1/m</rate>
</queue>
有人知道如何使队列一次只允许处理一个任务吗
Arun首先,即使实现一次只运行一个任务的机制,但任务之间的间隔比任务运行时间短,也会导致任务队列过多。尽管如此,我认为有两种可能的解决办法 解决方案一- 动作标记。创建一个数据存储条目,告诉您是否有任务正在运行。现在,当每个任务开始运行时,它会检查数据库,以查看是否有另一个任务正在运行,如果另一个任务正在运行,则将当前任务排队,在
N
秒后重试(使用countdown
参数:taskqueue.add(url='/tasks/your_task',countdown=delay_in_in_seconds,params=params)
)(请注意,您必须在此处找到处理比赛条件的方法)
解决方案二-
使用pull队列和每隔
N
秒运行一次的cron作业,再次使用action token。每次corn作业运行时,它都会检查是否有任务在运行,如果有,cron不会执行任何操作。如果没有任务在运行,它会在DB中设置运行标志。当任务完成时,它会将其取消设置。首先,即使您实现了me一次只运行一个任务的机制,但是任务之间的间隔比任务运行时间短,您将导致任务队列过多。也就是说,我看到两种可能的解决方案
解决方案一-
操作令牌。创建一个数据存储条目,以告知是否有任务正在运行。现在,当每个任务开始运行时,它会检查数据库,以查看是否有另一个任务正在运行,如果另一个任务正在运行,则将当前任务排队,在N
秒后重试(使用倒计时
参数:taskqueue.add(url='/tasks/your_task',countdown=delay_in_seconds,params=params)
)(请注意,您必须在此处找到处理竞争条件的方法)
解决方案二-
使用拉队列和每隔
N
秒运行一次的cron作业,再次使用操作令牌。每次corn作业运行时,它都会检查是否有任务在运行,如果有,cron不会执行任何操作。如果没有任务在运行,它会在数据库中设置运行标志。任务完成后,它会将其取消设置。这是防止任务被执行的好方法同时进行nning。您的一条评论建议您只在开发服务器上进行了测试。请在生产环境中试用,它应该可以工作
您可以通过确保任务需要很长时间才能完成来验证这一点,然后对一些任务进行排队。转到项目的控制台,在App Engine->Task Queues下查看,然后单击队列的名称。您将看到当前有多少任务正在运行。这是防止任务同时运行的好方法。您的一条评论建议您只在开发服务器上测试过sts。请在生产环境中试用,它应该可以工作
您可以通过确保任务需要很长时间才能完成来验证这一点,然后排队等待一些任务。进入项目控制台,在App Engine->Task Queues下查看,然后单击队列的名称。您将看到当前有多少任务正在运行。当您设置max Nach时,您是否可以详细说明为什么认为多个任务并行运行rrent到1?当我在运行任务的servlet上进行调试时,我看到两个线程卡在调试上。如果我提交三个任务,我看到三个线程。它完全忽略了最大并发请求。请详细说明为什么在将最大并发设为1时,您认为多个任务并行运行?当我在运行任务的servlet上进行调试时,我看到两个线程卡在调试中。如果我提交三个任务,我会看到三个线程。它完全忽略了这些解决方案的最大并发请求。我可以实现这些,但我想知道为什么最大并发请求不起作用。感谢这些解决方案。我可以实现这些,但我想知道为什么最大并发请求不起作用t-requests不起作用。是的。我只在开发服务器上尝试过。您的评论链接不起作用。我将在生产环境中尝试,并将此答案标记为正确,如果它在生产环境中有效,而在开发环境中无效。Opps!对于断开的链接,我感到抱歉。已修复。是的。我只在开发服务器上尝试过。您的评论链接不起作用。我将在produ中尝试如果这个答案在生产环境中有效,而不是在开发环境中,请单击Action并将其标记为正确。Opps!对于断开的链接,我深表歉意。已修复。