2014-06-17 30 views
2

我在CELERYD_CONCURRENCY = 4隊列中運行一系列長時間運行的重量級芹菜任務(產生多個子進程)。最初,他們應該開始4項任務。然而,隨着任務的完成,新任務將不會開始,直到完成更多任務並且即將完成,Celery會將活動任務的數量降至1或2,直到所有任務完成(由芹菜花確認)。Celery任務子進程填滿併發插槽?

當我只能運行簡單的任務,如默認芹菜add功能一切正常。

是否通過芹菜任務開始的子過程(與同一進程羣ID作爲任務)數以填補併發插槽?有什麼方法可以確保Celery本身只計算任務嗎?

+0

我有類似的問題,你使用的是eventlet/gevent?你有多少個隊列? –

+0

@RafaelBarros我正在使用一個隊列,而不是eventlet/gevent。 – Banana

+0

嘗試閱讀本,看它是否讓任何意義:http://celery.readthedocs.org/en/latest/userguide/concurrency/eventlet.html –

回答

2

Celery使用prefork作爲默認執行池,並且每次生成一個子進程(另一個fork)時,它計數到運行的併發進程數,即CELERYD_CONCURRENCY中的數字。

避免這種情況的方法是使用eventlet,這將允許您在每個任務上產生多個異步調用,只要您的任務沒有任何阻止的調用即可,如subprocess.communicate

爲了進一步優化,你可以嘗試拆分使用subprocess.communicate到不同的隊列中具有使用prefork的和其他一切與eventlet工人不會阻止工人的任務。

相關問題