Python 芹菜工人等待

Python 芹菜工人等待,python,celery,Python,Celery,我正在使用芹菜框架编写一个应用程序。我的一些任务相当重,可以执行很长时间 我注意到,当我运行5-6个工人,然后放置10-20个任务时,他们可能会被工人随机分配,有时如果一个人没有任务,它不会启动剩余的任务,只有当他们完成任务时(可能在几个小时内),他们才会被其他人处理。如果此时我再运行一个worker,它什么也不做,但可以接受新任务 它是一个bug还是一个特性?我如何解决我的需求?当我们有空闲的工作人员而没有开始任务时,等待几个小时是没有意义的。这不是一个bug或功能(更可能是一个功能),只是配

我正在使用芹菜框架编写一个应用程序。我的一些任务相当重,可以执行很长时间

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


它是一个bug还是一个特性?我如何解决我的需求?当我们有空闲的工作人员而没有开始任务时,等待几个小时是没有意义的。

这不是一个bug或功能(更可能是一个功能),只是配置错误

正如作者所说,工作人员可以为自己保留一些任务,以加快处理消息的速度。但这仅适用于小型和快速任务——它不会向代理请求新消息,而是立即启动保留消息

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

如果有许多任务的持续时间较长,则希望乘数值为1,这意味着每个辅助进程一次只保留一个任务

如果同时有长时间和短时间运行的任务,最好的选择是使用两个分别配置的工作节点,并根据运行时路由任务

因此,您需要在芹菜的设置中设置
CELERYD\u PREFETCH\u乘数=1

但是,

使用早期确认(默认)时,预回迁乘数为1意味着工作进程将为每个活动工作进程最多保留一个额外任务

当用户询问是否可以禁用“任务预取”时,他们真正想要的往往是让工作进程只保留与子进程数量相同的任务

我还建议将
芹菜\u ACKS\u LATE=True设置为仅在任务完成后发送ACK命令。这样,工作者就不会保留任何额外的任务,但当前正在执行的任务将被标记为仅保留


虽然这有副作用——如果工人在执行任务的过程中崩溃/终止,任务将再次标记为未启动,并且任何其他工作人员可以从头开始重新启动。因此,请确保您有

幂等任务。请再看一遍。

谢谢。。将所有长任务移动到单独的队列有意义吗?比如说,我有5种类型的长任务-我可以创建5个队列吗?嗯,有时是的,但你应该记住,每个
队列实际上是一个独立的工作进程。如果您的任务一直在运行-也许您应该为每个任务创建命名队列。但通常情况下,让进程什么都不做只是浪费资源(如果没有任务可供执行),您最好为繁重的任务创建一个单独的队列,并将这些设置仅应用于该队列,但为其他队列(执行速度快的)保留默认值。