芹菜工人等

时间:2016-10-03 11:12:08

标签: python celery

我正在使用Celery框架编写应用程序。我的一些任务非常重,可以执行很长时间。

我注意到,当我运行5-6个工人然后放10-20个任务时,他们可能会被工作人员随机分发,有时如果一个人没有任务,它就不会启动剩余的工作,他们将由其他人只有在完成任务时(可能在几小时内完成)。如果我此时再运行一名工人 - 它什么都不做,但可以接受新任务。

是错误还是功能?如何解决我的需求?在我们有自由工作者而没有开始任务的情况下等待几个小时是没有意义的。

1 个答案:

答案 0 :(得分:1)

这不是错误或功能(更有可能是功能),只是配置错误。

正如documentation所说,工作人员可以为自己保留一些任务以加快处理消息。但这只适用于小而快的任务 - 它不会向代理询问新消息,而是立即启动保留的消息。

但是对于长期任务,这可能导致你问题中描述的情况。

  

如果您有许多具有较长持续时间的任务,您希望乘数值为1,这意味着它一次只能为每个工作进程保留一个任务。

     

如果您有长期和短期运行任务的组合,最好的选择是使用两个单独配置的工作节点,并根据运行时路由任务。

因此,您需要在芹菜的设置中设置CELERYD_PREFETCH_MULTIPLIER = 1

但是,

  

使用早期确认(默认)时,预取乘数为1表示工作人员将为每个活动工作进程保留最多一个额外任务。

     

当用户询问是否可以禁用“预取任务”时,通常他们真正想要的是让工作人员只保留与子进程一样多的任务。

我还建议设置CELERY_ACKS_LATE = True仅在任务完成后发送ACK命令。这样,工作人员根本不会保留任何其他任务,但是当前正在执行的任务将被标记为仅保留。

虽然这会产生副作用 - 如果工作人员在执行任务时遇到崩溃/终止,则任务将再次标记为未启动,任何其他工作人员可能会从头开始再次启动它。因此,请确保您有idempotent个任务。请再次查看docs