Concurrency 芹菜:具有并发性和保留任务的工作者仅运行1个任务

Concurrency 芹菜:具有并发性和保留任务的工作者仅运行1个任务,concurrency,celery,django-celery,Concurrency,Celery,Django Celery,我的代码中的一些任务执行时间越来越长 检查后,我注意到,虽然我的worker节点设置为concurrency 6,并且存在6个进程来“执行工作”,但在“running tasks”下只显示1个任务。下面是一个小小的视觉证明: 以下是工人选项: 下面是仅运行1个进程的工作进程的任务选项卡: 我发现,如果我重新启动芹菜,并发性将再次得到尊重,我将看到>1个正在运行的任务,但经过一段时间/任务后,它会恢复到这种行为 有没有解决这个间歇性问题的方法?我不确定这是否是您的用例,但当我同时执行长任务和短

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

检查后,我注意到,虽然我的worker节点设置为concurrency 6,并且存在6个进程来“执行工作”,但在“running tasks”下只显示1个任务。下面是一个小小的视觉证明:

以下是工人选项:

下面是仅运行1个进程的工作进程的任务选项卡:

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


有没有解决这个间歇性问题的方法?

我不确定这是否是您的用例,但当我同时执行长任务和短任务时,我遇到了类似的问题。基本上发生的情况是,在某个点上,一个进程可以启动一个长时间运行的任务,同时预取一些其他任务,防止它们被其他进程占用。所以我禁用了预取功能,这只有在运行大量短任务时才有用

要禁用预回迁,您需要芹菜3.1+和,例如:

celery -A proj worker -l info -Ofair
这些文档提到了如何一次保留一个任务,或者只保留您的并发任务:

用户经常询问是否可以禁用“任务预取”,但他们真正的意思是,让一个工作进程只保留与工作进程数量相同的任务(10个未确认的任务用于-c 10)

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

或等效代码:

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

我在Heroku上也遇到过同样的问题。在长时间运行任务期间,所有其他工作人员不接受任何新任务。这有什么好运气吗?你有没有遇到这个错误?嗨,Buttons840,我看了一下这个问题就不能确定了,但似乎有很多相似的地方。我的团队将密切关注这个问题,看看它的解决方案是否解决了我们的问题(以及我们是否可以避免使用“-Ofair”选项)。好发现!有人知道为什么芹菜没有在同一个盒子上的其他工人身上运行任何东西吗?是因为主作业占用了太多CPU吗@steve gregoryEven关于预取问题,既然任务没有被预取,那么其他进程不应该正确处理新任务吗?很抱歉回答这个问题时耽搁了很长时间。我之所以将此作为答案,是因为至少目前看来,它已经解决了这个问题。我现在运行任务的#数量接近并发限制,但我还没有在更大范围内尝试这一点..哇,我很惊讶芹菜会预取任务。。。我的意思是,与头痛的原因相比,这带来的性能提升是微不足道的,因为任务没有立即启动,因为它们已经被特定的工作人员获取,而现在执行某些任务需要一些时间!!!接下来,光是-O公平选项并不能解决我的问题。我尝试过设置更大(或更小)的并发性值(在工作线程上)、每个子线程的最大任务数(在工作线程上)和CELERYD_预取_乘数,但都没有效果。如果我找到了,我会写一个解决方案。这个
-Ofair
选项似乎只解决了我的问题;我的主动任务从20聚合到1,现在(ofc在重启后恢复正常),它在18-20/20时从大约1小时开始保持;这是因为这里提到的长时间运行的任务。这个解决方案很好,只适用于每个队列,所以我可以将这个队列用于长时间运行的任务。
app = Celery(...)
app.conf.worker_prefetch_multiplier = 1
app.conf.task_acks_late = True
...