django & celery - 關於並發處理能力和內存使用的小結


背景

眾所周知,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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM