Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine Google应用程序引擎任务队列-仅允许一项_Google App Engine - Fatal编程技术网

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

Google app engine Google应用程序引擎任务队列-仅允许一项,google-app-engine,Google App Engine,我对推送队列有一个奇怪的问题 我一次只需要从这个队列运行一个任务。我已将最大并发请求设置为1的推送队列配置。但当我将任务提交到队列时,它们最终会并行运行。我不得不将速率降低到每分钟1次。但是,如果我的任务耗时超过1分钟,会发生什么?他们两个将并行运行 <queue> <name>winCoinsCalculatorQueue</name> <max-concurrent-requests>1</max-concurrent-r

我对推送队列有一个奇怪的问题

我一次只需要从这个队列运行一个任务。我已将最大并发请求设置为1的推送队列配置。但当我将任务提交到队列时,它们最终会并行运行。我不得不将速率降低到每分钟1次。但是,如果我的任务耗时超过1分钟,会发生什么?他们两个将并行运行

<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!对于断开的链接,我深表歉意。已修复。