非同步任務佇列Celery在Django中的使用

2022-05-02 09:24:21 字數 2670 閱讀 2035

前段時間在django web平台開發中,碰到一些請求執行的任務時間較長(幾分鐘),為了加快使用者的響應時間,因此決定採用非同步任務的方式在後台執行這些任務。在同事的指引下接觸了celery這個非同步任務佇列框架,鑑於網上關於celery和django結合的文件較少,大部分也只是粗粗介紹了大概的流程,在實踐過程中還是遇到了不少坑,希望記錄下來幫助有需要的朋友。

圖1. django架構總覽

同步請求:所有邏輯處理、資料計算任務在view中處理完畢後返回response。在view處理任務時使用者處於等待狀態,直到頁面返回結果。

celery是基於python開發的乙個分布式任務佇列框架,支援使用任務佇列的方式在分布的機器/程序/執行緒上執行任務排程。

圖2. celery架構

圖2展示的是celery的架構,它採用典型的生產者-消費者模式,主要由三部分組成:broker(訊息佇列)、workers(消費者:處理任務)、backend(儲存結果)。實際應用中,使用者從web前端發起乙個請求,我們只需要將請求所要處理的任務丟入任務佇列broker中,由空閒的worker去處理任務即可,處理的結果會暫存在後台資料庫backend中。我們可以在一台機器或多台機器上同時起多個worker程序來實現分布式地並行處理任務。

在實際使用過程中,發現celery在django裡的實現與其在一般.py檔案中的實現還是有很大差別,django有其特定的使用celery的方式。這裡著重介紹celery在django中的實現方法,簡單介紹與其在一般.py檔案中實現方式的差別。

1. 建立訊息佇列

首先,我們必須擁有乙個broker訊息佇列用於傳送和接收訊息。celery官網給出了多個broker的備選方案:rabbitmq、redis、database(不推薦)以及其他的訊息中介軟體。在官網的強力推薦下,我們就使用rabbitmq作為我們的訊息中間人。在linux上安裝的方式如下:

sudo apt-get install rabbitmq-server
命令執行成功後,rabbitmq-server就已經安裝好並執行在後台了。

另外也可以通過命令rabbitmq-server -detached來在後台啟動rabbitmq server以及命令rabbitmqctl stop來停止server。

2. 安裝django-celery

pip install celery

pip install django-celery

3. 配置settings.py

首先,在django工程的settings.py檔案中加入如下配置**:

5. 生產任務

在需要執行該任務的view中,通過build_job.delay的方式來建立任務,並送入訊息佇列。比如:

6. 啟動worker的命令

#

先啟動伺服器

python manage.py runserver

#再啟動worker

python manage.py celery worker -c 4 --loglevel=info

django下要檢視其他celery的命令,包括引數配置、啟動多worker程序的方式都可以通過python manage.py celery --help來檢視:

另外,celery提供了乙個工具flower,將各個任務的執**況、各個worker的健康狀態進行監控並以視覺化的方式展現,如下圖所示:

django下實現的方式如下: 

1. 安裝flower:

pip install flower
2. 啟動flower(缺省會啟動乙個webserver,埠為5555):

python manage.py celery flower
3. 進入http://localhost:5555即可檢視。

celery 非同步任務佇列

celery是基於python開發的分布式任務佇列。它可以讓任務的執行完全脫離主程式,甚至可以被分配到其他主機上執行。我們通常使用它來實現非同步任務 async task 和定時任務 crontab 它的架構組成如下圖 celery 4.x以上版本不安裝該模組,新增任務時會報錯 使用celery包含...

非同步任務佇列Celery在Django中的使用

前段時間在django web平台開發中,碰到一些請求執行的任務時間較長 幾分鐘 為了加快使用者的響應時間,因此決定採用非同步任務的方式在後台執行這些任務。在同事的指引下接觸了celery這個非同步任務佇列框架,鑑於網上關於celery和django結合的文件較少,大部分也只是粗粗介紹了大概的流程,...

非同步任務佇列Celery在Django中的使用

前段時間在django web平台開發中,碰到一些請求執行的任務時間較長 幾分鐘 為了加快使用者的響應時間,因此決定採用非同步任務的方式在後台執行這些任務。在同事的指引下接觸了celery這個非同步任務佇列框架,鑑於網上關於celery和django結合的文件較少,大部分也只是粗粗介紹了大概的流程,...