背景
眾所周知,celery 是python世界里處理分布式任務的好助手,它的出現結合賦予了我們強大的處理異步請求,分布式任務,周期任務等復雜場景的能力。
然鵝,今天我們所要討論的則是如何更好的在使用celery, 主要討論的點針是對內存的使用方面。
django & celery & django-celery
樓主的項目中使用的是 celery 和 django 的相結合的方式,版本分別為:
python == 2.7 celery==3.1.25 Django==1.11.7 django-celery==3.2.2
celery 處理並發
項目中使用celery beat 來觸發定時任務;並且根據業務需求,分別使用了2個 celery worker 來處理異步請求。
在開發環境下,操作系統有4個processors, 內存為8GB。在默認情況下,啟動celerycelery beat 和 兩個 worker 后,並發情況如下:

可以看到,默認情況下,celery 會根據processor的數量(4個)來啟動相應數量的worker。
celery 允許我們通過配置 ‘CELERYD_CONCURRENCY ’ 來 控制 celery worker 並發數 。
當修改celery worker 為 tasksWorker 的 worker 的配置為: CELERYD_CONCURRENCY = 2 后,worker數量如下圖:

我們可以看到, 只有 2個 worker 被啟動。
celery worker 關於內存
網上有不少帖子分析過 celery worker 對於內存的使用,發現worker在處理完任務后並沒有釋放內存。但是,celery提供了一個配置允許我們制定每個worker處理任務的最大數量 (CELERYD_MAX_TASKS_PER_CHILD),當一個worker處理任務的數量到達制定數量后,celery會銷毀該worker並且重新啟動一個新的。
當 CELERYD_MAX_TASKS_PER_CHILD = 5 時,worker運行多次后,可以看到 舊的worker 被銷毀,新的 worker 被啟動。
舊的 worker :


新的 worker :

此外,當我們結合使用 django 和 celery是,需要關閉 Debug 配置,因為開啟會引起celery beat 的 memory leak。 詳細描述請看:https://stackoverflow.com/questions/45366680/celerybeat-process-consumes-all-os-memory
