Celery:具有并发性和保留任务的工作程序仅运行1个任务

时间:2014-07-01 21:29:14

标签: concurrency celery django-celery

我的代码中的一些任务执行时间越来越长。

经过检查,我注意到虽然我的工作节点设置为并发6,并且存在6个进程以“正常工作”,但只有1个任务显示在“正在运行的任务”下。这是一个小小的视觉证明:

以下是工人选项:

The worker options, as seen by flower

以下是该工作人员的任务选项卡,只有一个正在运行的进程:

enter image description here

我发现如果我重新启动芹菜,并发性再次得到尊重,我将看到> 1运行任务,但经过一段时间/任务后,它会恢复到此行为..

解决这个间歇性问题的想法吗?

2 个答案:

答案 0 :(得分:19)

我不确定这是否是你的用例,但是当我混合使用长期和短期任务时,我遇到了类似的问题。基本上发生的事情是,在某个时刻,进程可以启动一个非常长时间运行的任务,同时预取一些其他任务,防止它们被其他进程占用。所以我禁用了预取的东西,这只有在你运行很多简短的任务时才有用。

要禁用预取,您需要Celery 3.1+和Ofair setting,例如:

celery -A proj worker -l info -Ofair

答案 1 :(得分:0)

文档提到here如何一次保留一项任务-或仅与您并发的任务一样多:

通常用户会问是否可以禁用“任务的预取”,但实际上,这意味着让工作人员仅保留与工作人员进程一样多的任务(对于-c 10是10个未确认的任务)

这是可能的,但不能不启用延迟确认。在默认行为上使用此选项意味着在电源故障或工作实例突然被杀死的情况下将重试已经开始执行的任务,因此这也意味着该任务必须是幂等的 ... 您可以使用以下配置选项来启用此行为:

task_acks_late = True
worker_prefetch_multiplier = 1

或等效代码:

app = Celery(...)
app.conf.worker_prefetch_multiplier = 1
app.conf.task_acks_late = True
...