我是芹菜和redis的新手。芹菜多個工人,但一個隊列
我使用redis-server
啓動了我的redis服務器。
芹菜使用此參數
celery -A proj worker
有沒有其他的配置上運行。但是,我意識到,當我在芹菜中有一個長時間運行的作業時,它不會處理隊列中的另一個任務,直到長時間運行的任務完成。我的理解是,因爲我的CPU有8個內核,所以我應該能夠同時處理8個任務,因爲-c
的默認參數是內核數量?
我在這裏錯過了什麼嗎?
我是芹菜和redis的新手。芹菜多個工人,但一個隊列
我使用redis-server
啓動了我的redis服務器。
芹菜使用此參數
celery -A proj worker
有沒有其他的配置上運行。但是,我意識到,當我在芹菜中有一個長時間運行的作業時,它不會處理隊列中的另一個任務,直到長時間運行的任務完成。我的理解是,因爲我的CPU有8個內核,所以我應該能夠同時處理8個任務,因爲-c
的默認參數是內核數量?
我在這裏錯過了什麼嗎?
你的問題是古典的,每一個人都遇到了這個誰長期運行的任務。
根本原因是芹菜試圖優化您的執行流程,爲每個工作人員保留一些任務。但是,如果其中一項任務長期運行,其他人將被鎖定。它被稱爲「預取計數」。這是因爲默認情況下,芹菜設置爲短期任務。
另一個相關的設置是'遲到'。默認情況下,工作人員從隊列中取出任務並立即發送「確認」信號,然後代理將此任務從隊列中移除。但這意味着更多的消息將被預取給這位工作人員。 '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
啓動工作人員也是這樣。