2017-02-24 61 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啓動工作人員也是這樣。