溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在Django中使用Celery異步任務(wù)隊(duì)列

發(fā)布時間:2021-01-16 11:07:42 來源:億速云 閱讀:439 作者:Leah 欄目:開發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何在Django中使用Celery異步任務(wù)隊(duì)列,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、Django中的異步請求

Django Web中從一個http請求發(fā)起,到獲得響應(yīng)返回html頁面的流程大致如下:http請求發(fā)起 -- http handling(request解析) -- url mapping(url正則匹配找到對應(yīng)的View) -- 在View中進(jìn)行邏輯的處理、數(shù)據(jù)計(jì)算(包括調(diào)用Model類進(jìn)行數(shù)據(jù)庫的增刪改查)--將數(shù)據(jù)推送到template,返回對應(yīng)的template/response。

如何在Django中使用Celery異步任務(wù)隊(duì)列

圖1. Django架構(gòu)總覽

同步請求:所有邏輯處理、數(shù)據(jù)計(jì)算任務(wù)在View中處理完畢后返回response。在View處理任務(wù)時用戶處于等待狀態(tài),直到頁面返回結(jié)果。

異步請求:View中先返回response,再在后臺處理任務(wù)。用戶無需等待,可以繼續(xù)瀏覽網(wǎng)站。當(dāng)任務(wù)處理完成時,我們可以再告知用戶。

二、關(guān)于Celery

Celery是基于Python開發(fā)的一個分布式任務(wù)隊(duì)列框架,支持使用任務(wù)隊(duì)列的方式在分布的機(jī)器/進(jìn)程/線程上執(zhí)行任務(wù)調(diào)度。

如何在Django中使用Celery異步任務(wù)隊(duì)列

圖2. Celery架構(gòu)

圖2展示的是Celery的架構(gòu),它采用典型的生產(chǎn)生-消費(fèi)者模式,主要由三部分組成:broker(消息隊(duì)列)、workers(消費(fèi)者:處理任務(wù))、backend(存儲結(jié)果)。實(shí)際應(yīng)用中,用戶從Web前端發(fā)起一個請求,我們只需要將請求所要處理的任務(wù)丟入任務(wù)隊(duì)列broker中,由空閑的worker去處理任務(wù)即可,處理的結(jié)果會暫存在后臺數(shù)據(jù)庫backend中。我們可以在一臺機(jī)器或多臺機(jī)器上同時起多個worker進(jìn)程來實(shí)現(xiàn)分布式地并行處理任務(wù)。

三、Django中Celery的實(shí)現(xiàn)

在實(shí)際使用過程中,發(fā)現(xiàn)在Celery在Django里的實(shí)現(xiàn)與其在一般.py文件中的實(shí)現(xiàn)還是有很大差別,Django有其特定的使用Celery的方式。這里著重介紹Celery在Django中的實(shí)現(xiàn)方法,簡單介紹與其在一般.py文件中實(shí)現(xiàn)方式的差別。

1. 建立消息隊(duì)列

首先,我們必須擁有一個broker消息隊(duì)列用于發(fā)送和接收消息。Celery官網(wǎng)給出了多個broker的備選方案:RabbitMQ、Redis、Database(不推薦)以及其他的消息中間件。在官網(wǎng)的強(qiáng)力推薦下,我們就使用RabbitMQ作為我們的消息中間人。在Linux上安裝的方式如下:

sudo apt-get install rabbitmq-server

命令執(zhí)行成功后,rabbitmq-server就已經(jīng)安裝好并運(yùn)行在后臺了。

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

更多的命令可以參考rabbitmq官網(wǎng)的用戶手冊:https://www.rabbitmq.com/manpages.html

2. 安裝django-celery

pip install celery
pip install django-celery

3. 配置settings.py

首先,在Django工程的settings.py文件中加入如下配置代碼:

import djcelery
djcelery.setup_loader()
BROKER_URL= 'amqp://guest@localhost//'
CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'

其中,當(dāng)djcelery.setup_loader()運(yùn)行時,Celery便會去查看INSTALLD_APPS下包含的所有app目錄中的tasks.py文件,找到標(biāo)記為task的方法,將它們注冊為celery task。BROKER_URL和CELERY_RESULT_BACKEND分別指代你的Broker的代理地址以及Backend(result store)數(shù)據(jù)存儲地址。在Django中如果沒有設(shè)置backend,會使用其默認(rèn)的后臺數(shù)據(jù)庫用來存儲數(shù)據(jù)。注意,此處backend的設(shè)置是通過關(guān)鍵字CELERY_RESULT_BACKEND來配置,與一般的.py文件中實(shí)現(xiàn)celery的backend設(shè)置方式有所不同。一般的.py中是直接通過設(shè)置backend關(guān)鍵字來配置,如下所示:

app = Celery('tasks', backend='amqp://guest@localhost//', broker='amqp://guest@localhost//')

然后,在INSTALLED_APPS中加入djcelery:

INSTALLED_APPS = (
  ……  
  'qv',
  'djcelery'
  ……  
)

4. 在要使用該任務(wù)隊(duì)列的app根目錄下(比如qv),建立tasks.py,比如:

如何在Django中使用Celery異步任務(wù)隊(duì)列

在tasks.py中我們就可以編碼實(shí)現(xiàn)我們需要執(zhí)行的任務(wù)邏輯,在開始處import task,然后在要執(zhí)行的任務(wù)方法開頭用上裝飾器@task。需要注意的是,與一般的.py中實(shí)現(xiàn)celery不同,tasks.py必須建在各app的根目錄下,且不能隨意命名。

5. 生產(chǎn)任務(wù)

在需要執(zhí)行該任務(wù)的View中,通過build_job.delay的方式來創(chuàng)建任務(wù),并送入消息隊(duì)列。比如:

如何在Django中使用Celery異步任務(wù)隊(duì)列

6. 啟動worker的命令

#先啟動服務(wù)器
python manage.py runserver
#再啟動worker 
python manage.py celery worker -c 4 --loglevel=info

四、補(bǔ)充

Django下要查看其他celery的命令,包括參數(shù)配置、啟動多worker進(jìn)程的方式都可以通過python manage.py celery --help來查看:

如何在Django中使用Celery異步任務(wù)隊(duì)列

另外,Celery提供了一個工具flower,將各個任務(wù)的執(zhí)行情況、各個worker的健康狀態(tài)進(jìn)行監(jiān)控并以可視化的方式展現(xiàn),如下圖所示:

如何在Django中使用Celery異步任務(wù)隊(duì)列

Django下實(shí)現(xiàn)的方式如下: 

1. 安裝flower:

pip install flower

2. 啟動flower(默認(rèn)會啟動一個webserver,端口為5555):

python manage.py celery flower

3. 進(jìn)入http://localhost:5555即可查看。

上述就是小編為大家分享的如何在Django中使用Celery異步任務(wù)隊(duì)列了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI