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

ace*_*ner 4 redis celery

我是芹菜和redis的新手.

我通过使用启动了我的redis服务器redis-server.

使用此参数运行Celery

celery -A proj worker 
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么吗?

bal*_*ldr 7

你的问题很经典,每个人都遇到了这个有长期任务的人.

根本原因是芹菜试图优化您的执行流程,为每个工人保留一些任务.但如果其中一项任务长期运行,其他任务就会被锁定.它被称为'预取计数'.这是因为默认情况下芹菜设置为短任务.

另一个相关的设置是'迟到的'.默认情况下,worker从队列中获取任务并立即发送'acknowledge'信号,然后代理从队列中删除此任务.但这意味着将为此工作人员预取更多消息.'late ack'enabled表示只有在任务完成后才能发送确认.

这只是两个字.您可以阅读有关预取和晚期确认的更多信息.

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

task_acks_late = True
worker_prefetch_multiplier = 1
Run Code Online (Sandbox Code Playgroud)

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

CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1
Run Code Online (Sandbox Code Playgroud)

此外,使用参数启动worker -0fair也是一样的.