一 Django中的異步請求
Django Web中從一個http請求發(fā)起,到獲得相應(yīng)返回html頁面流程大致如下:
1 http請求發(fā)起
2 http handing(request解析)
3 url mapping(url正則匹配找到對應(yīng)的View)
4 在View中進(jìn)行邏輯的處理更卒,數(shù)據(jù)計算(包括調(diào)用Model類進(jìn)行數(shù)據(jù)庫的增刪改查)
5 將數(shù)據(jù)推送到template,返回對應(yīng)的template/response
同步請求:
??????? 所有邏輯處理扁瓢,數(shù)據(jù)計算任務(wù)在View中處理完畢后返回response.在View處理任務(wù)時用戶處于等待狀態(tài)渠概,值直到頁面返回結(jié)果
異步請求:
?????????? View中先返回response,再在后臺處理任務(wù)。用戶無需等待,可以繼續(xù)瀏覽網(wǎng)站查辩,任務(wù)玩車該時媳禁,我們再告知用戶
二 關(guān)于celery
???? Celery時基于Python開發(fā)的一個分布式任務(wù)隊(duì)列框架眠副,支持使用任務(wù)隊(duì)列的方式在分布的機(jī)器/進(jìn)程/線程上執(zhí)行任務(wù)調(diào)度
1? 建立消息隊(duì)列
?? 首先,我們必須擁有一個broker消息隊(duì)列用于發(fā)送和接受消息竣稽。Celery官網(wǎng)提出了多個broker選擇方案囱怕,RabbitMQ霍弹、Redis、Database(不推薦)以及其他的消息中間件娃弓。
我們就使用RabbitMQ作為我們的消息中間人典格。在Linux上安裝的方式如下:
sudo? apt-get? install? rabbitmq-server
可以通過命令rabbitmq-server來啟動rabbitmq server以及命令rabbitmqctl stop來停止server
2? 安裝Django-celery
pip? install celery
pip? install django-celery
3 配置settings.py
首先,在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來配置
然后实胸,在INSTALLED_APPS中加入djcelery:
? INSTALL_APPS =(
'app1',
'djcelery'
)
4? 在要使用該任務(wù)隊(duì)列的app根目錄下(比如app1)他嫡,建立tasks.py文件,比如:
5 生產(chǎn)任務(wù)
在需要執(zhí)行該任務(wù)的View中,通過build_job.delay的方法來創(chuàng)建任務(wù)假褪,并送入消息隊(duì)列署咽,比如:
6? 啟動worker的命令
python manage.py runserver #先啟動服務(wù)器
python? manage.py? celery worker -c 4 --loglevel=info #再啟動worker
補(bǔ)充:Django下可通過 python? manage.py? celery -- help 查看celery其他命令
另外,Celery提供了一個工具flower生音,將各個任務(wù)的執(zhí)行情況宁否、各個worker的健康狀態(tài)進(jìn)行監(jiān)控并以可視化的方式展現(xiàn),如下圖所示:
Django下實(shí)現(xiàn)的方式如下:
1安裝flower
pip? install flower
2? 啟動flower(默認(rèn)會啟動一個webserver缀遍,端口為5555):
python? manege.py? celery? flower
3. 進(jìn)入http://localhost:5555即可查看慕匠。