【问题标题】:how to configure celery executing tasks concurrently from on queue如何配置芹菜从队列中同时执行任务
【发布时间】:2015-05-13 11:22:05
【问题描述】:

在 8 核的环境下,celery 默认应该能够并行处理 8 个传入的任务。但有时当收到新任务时,celery 会将它们置于一个长时间运行的进程之后。

我使用默认配置,让一名工作人员从一个队列中消费。

celery -A proj worker --loglevel=INFO --concurrency=8

我的理解是错误的吗,一个并发 8 的 worker 可以并行处理一个队列中的 8 个任务?

如何设置 celery 以防止上述此类行为?

【问题讨论】:

  • 我也经历过同样的行为。在谷歌搜索时,我发现this question 看起来很相似。也许那里描述的解决方案有帮助?
  • 我可以看到预取是如何导致这种行为的。

标签: python concurrency celery


【解决方案1】:

简单地说,并发是在一个工作器上运行的作业数量。预取是工作人员本身队列中的作业数量。您在这里有 2 个选项中的 1 个。第一个是将预取乘数设置为 1。这意味着在您的情况下,工作人员只会在其队列中保留 8 个额外的作业。我建议的第二种方法是创建 2 个不同的队列,一个用于短期运行的任务,另一个用于长期运行的任务。

【讨论】:

  • 在不并行处理相同任务的情况下,是否能够定义更多从同一队列消费的工人?
  • 我有点困惑你的意思。您可以将多个工作人员分配到同一个队列,同时处理任务,但永远不会从队列中获取相同的任务。
  • than,这是一种奇怪的行为,我在玩我的 celery 实例时意识到了这一点。我正在使用 -n worker2.%%h 附加的相同工作命令
  • -n 选项命名工作人员查看 -Q 选项并将您的任务移动到不同的队列中。