芹菜多个工人,但一个队列



我是芹菜和雷迪斯的新手。

我使用redis-server启动了Redis服务器。

使用此参数运行芹菜

celery -A proj worker 

没有其他配置。但是,我意识到,当我在芹菜中的运行时间很长时,它不会处理在长期运行的任务完成之前在队列中的另一个任务。我的理解是,由于我的CPU上有8个内核,因此我应该能够同时处理8个任务,因为-c的默认参数是核心的数量?

我在这里错过了什么吗?

您的问题是经典的,每个人都遇到了长期运行的任务。

根本原因是芹菜试图优化您的执行流量为每个工人保留某些任务。但是,如果这些任务之一是长期运行的,那么其他任务就会被锁定。它被称为"预取数"。这是因为默认情况下为短任务设置了芹菜。

另一个相关的设置是"晚期ACK"。默认情况下,工人从队列中执行任务,并立即发送"确认"信号,然后经纪人从队列中删除此任务。但这意味着将为该工人提供更多消息。"迟到的ACK"启用了该任务完成后才告诉Worker仅在完成确认。

这只是两个词。您可能会阅读有关预摘要和晚期Ack的更多信息。

至于解决方案 - 只需使用这些设置(芹菜4.x):

task_acks_late = True
worker_prefetch_multiplier = 1

或以前的版本(2.x -3.x):

CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1

另外,使用参数-Ofair启动工人也相同。

相关内容

  • 没有找到相关文章

最新更新