衆所周知,celery 是python世界裏處理分佈式任務的好助手,它的出現結合賦予了咱們強大的處理異步請求,分佈式任務,週期任務等複雜場景的能力。python
然鵝,今天咱們所要討論的則是如何更好的在使用celery, 主要討論的點針是對內存的使用方面。django
樓主的項目中使用的是 celery 和 django 的相結合的方式,版本分別爲:併發
python == 2.7 celery==3.1.25 Django==1.11.7 django-celery==3.2.2
項目中使用celery beat 來觸發定時任務;而且根據業務需求,分別使用了2個 celery worker 來處理異步請求。異步
在開發環境下,操做系統有4個processors, 內存爲8GB。在默認狀況下,啓動celerycelery beat 和 兩個 worker 後,併發狀況以下:分佈式
能夠看到,默認狀況下,celery 會根據processor的數量(4個)來啓動相應數量的worker。 spa
celery 容許咱們經過配置 ‘CELERYD_CONCURRENCY ’ 來 控制 celery worker 併發數 。
操作系統
當修改celery worker 爲 tasksWorker 的 worker 的配置爲: CELERYD_CONCURRENCY = 2 後,worker數量以下圖:code
咱們能夠看到, 只有 2個 worker 被啓動。blog
網上有很多帖子分析過 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