您好,登錄后才能下訂單哦!
本文記錄django中如何使用celery完成異步任務(wù)。
Celery 是一個簡單、靈活且可靠的,處理大量消息的分布式系統(tǒng),并且提供維護(hù)這樣一個系統(tǒng)的必需工具。
它是一個專注于實時處理的任務(wù)隊列,同時也支持任務(wù)調(diào)度。
官方網(wǎng)站
中文文檔
示例一:用戶發(fā)起request,并等待response返回。在本些views中,可能需要執(zhí)行一段耗時的程序,那么用戶就會等待很長時間,造成不好的用戶體驗
示例二:網(wǎng)站每小時需要同步一次天氣預(yù)報信息,但是http是請求觸發(fā)的,難道要一小時請求一次嗎?
使用celery后,情況就不一樣了
示例一的解決:將耗時的程序放到celery中執(zhí)行
示例二的解決:使用celery定時執(zhí)行
名詞
任務(wù)task:就是一個Python函數(shù)
隊列queue:將需要執(zhí)行的任務(wù)加入到隊列中
工人worker:在一個新進(jìn)程中,負(fù)責(zé)執(zhí)行隊列中的任務(wù)
代理人broker:負(fù)責(zé)調(diào)度,在布置環(huán)境中使用redis
本示例在ubuntu系統(tǒng)中,使用django1.8.2,并且要安裝redis
1,首先需要安裝擴(kuò)展包。
pip install celery==3.1.25 pip install celery-with-redis==3.0 pip install django-celery==3.1.17
2,配置項目setting.py
加入以下代碼:
import djcelery djcelery.setup_loader() BROKER_URL = 'redis://127.0.0.1:6379/0' CELERY_IMPORTS = ('bookstory.task')
CELERY_IMPORTS值是異步任務(wù)函數(shù)所在的位置,比如這個是bookstory應(yīng)用里面的task.py文件里,如圖:
并且將'djcelery'加入到setting.py的INSTALLED_APPS里面。
3,編寫需要異步執(zhí)行(或者耗時)的功能函數(shù)
編寫task.py文件,假設(shè)我就這樣模擬耗時操作
# coding=utf-8 import time from celery import task @task def showa(): # 任務(wù)函數(shù) print('hello....') time.sleep(5) print('world....')
4,遷移,生成celery需要的數(shù)據(jù)表
python manage.py migrate
5,啟動worker
python manage.py celery worker --loglevel=info
6,使用
新建一個視圖函數(shù),并且分配一個url
from task import * ......... # celery異步 def showTest(request): showa.delay() return HttpResponse('哈哈哈')
調(diào)用語法就是:
function.delay(parameters)
function就是task里寫的函數(shù),parameters就是這個函數(shù)要傳遞的參數(shù),我的showa沒有傳參數(shù),所以就直接showa.delay()就可以調(diào)用了。
運行結(jié)果就是在瀏覽器中并沒有等待5秒,而是直接輸出'哈哈'了。并沒有因為耗時的操作二延遲。在啟動worker的窗口里面可以看到hello,world間隔5秒分別輸出了出來:
按照步驟來,其實并不難,具體異步(耗時)操作根據(jù)具體業(yè)務(wù)在task里面具體編寫就ok了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。