2017-02-24 39 views
2

我是芹菜和redis的新手。芹菜多个工人,但一个队列

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

芹菜使用此参数

celery -A proj worker 

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

我在这里错过了什么吗?

回答

4

你的问题是古典的,每一个人都遇到了这个谁长期运行的任务。

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

另一个相关的设置是'迟到'。默认情况下,工作人员从队列中取出任务并立即发送“确认”信号,然后代理将此任务从队列中移除。但这意味着更多的消息将被预取给这位工作人员。 'late ack'enabled告诉工作人员只有在任务完成后才发送确认。

这只是两个字。你可以read more about prefetch and late ack

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

task_acks_late = True 
worker_prefetch_multiplier = 1 

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

CELERY_ACKS_LATE = True 
CELERYD_PREFETCH_MULTIPLIER = 1 

而且,用参数-0fair启动工作人员也是这样。

相关问题