【问题标题】:Google application engine task queue - allow only one itemGoogle 应用程序引擎任务队列 - 只允许一项
【发布时间】:2016-07-11 00:38:19
【问题描述】:

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

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

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

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

有人知道如何让队列一次只允许处理一项任务吗?

阿伦

【问题讨论】:

  • 您能否详细说明为什么您认为将 max concurrent 设置为 1 时会并行运行多个任务?
  • 当我在运行任务的 servlet 上进行调试时,我看到两个线程卡在调试上。如果我提交三个任务,我会看到三个线程。它完全忽略了最大并发请求

标签: google-app-engine


【解决方案1】:

这是防止任务同时运行的好方法。您的其中一个 cmets 建议您仅在开发服务器上进行了测试。 The dev server does not respect some of the task queue settings. 在生产环境中尝试一下,应该可以了。

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

【讨论】:

  • 是的。我只在开发服务器上尝试过。您的评论链接无效。如果它适用于生产而不是开发,我将在生产中尝试并将此答案标记为正确。
  • 哎呀!很抱歉链接断开。固定。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您提供这些解决方案。我本可以实现这些,但我想知道为什么 max-concurrent-requests 不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多