django中使用Celery 布式任務(wù)隊(duì)列過程詳解
本文記錄django中如何使用celery完成異步任務(wù)。
Celery 是一個(gè)簡(jiǎn)單、靈活且可靠的,處理大量消息的分布式系統(tǒng),并且提供維護(hù)這樣一個(gè)系統(tǒng)的必需工具。
它是一個(gè)專注于實(shí)時(shí)處理的任務(wù)隊(duì)列,同時(shí)也支持任務(wù)調(diào)度。
示例一:用戶發(fā)起request,并等待response返回。在本些views中,可能需要執(zhí)行一段耗時(shí)的程序,那么用戶就會(huì)等待很長(zhǎng)時(shí)間,造成不好的用戶體驗(yàn)
示例二:網(wǎng)站每小時(shí)需要同步一次天氣預(yù)報(bào)信息,但是http是請(qǐng)求觸發(fā)的,難道要一小時(shí)請(qǐng)求一次嗎?
使用celery后,情況就不一樣了
示例一的解決:將耗時(shí)的程序放到celery中執(zhí)行
示例二的解決:使用celery定時(shí)執(zhí)行
名詞
任務(wù)task:就是一個(gè)Python函數(shù)
隊(duì)列queue:將需要執(zhí)行的任務(wù)加入到隊(duì)列中
工人worker:在一個(gè)新進(jìn)程中,負(fù)責(zé)執(zhí)行隊(duì)列中的任務(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,配置項(xiàng)目setting.py
加入以下代碼:
import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_IMPORTS = ('bookstory.task')
CELERY_IMPORTS值是異步任務(wù)函數(shù)所在的位置,比如這個(gè)是bookstory應(yīng)用里面的task.py文件里,如圖:

并且將'djcelery'加入到setting.py的INSTALLED_APPS里面。
3,編寫需要異步執(zhí)行(或者耗時(shí))的功能函數(shù)
編寫task.py文件,假設(shè)我就這樣模擬耗時(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,啟動(dòng)worker
python manage.py celery worker --loglevel=info
6,使用
新建一個(gè)視圖函數(shù),并且分配一個(gè)url
from task import *
.........
# celery異步
def showTest(request):
showa.delay()
return HttpResponse('哈哈哈')
調(diào)用語法就是:
function.delay(parameters)
function就是task里寫的函數(shù),parameters就是這個(gè)函數(shù)要傳遞的參數(shù),我的showa沒有傳參數(shù),所以就直接showa.delay()就可以調(diào)用了。
運(yùn)行結(jié)果就是在瀏覽器中并沒有等待5秒,而是直接輸出'哈哈'了。并沒有因?yàn)楹臅r(shí)的操作二延遲。在啟動(dòng)worker的窗口里面可以看到hello,world間隔5秒分別輸出了出來:

按照步驟來,其實(shí)并不難,具體異步(耗時(shí))操作根據(jù)具體業(yè)務(wù)在task里面具體編寫就ok了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- django 實(shí)現(xiàn)celery動(dòng)態(tài)設(shè)置周期任務(wù)執(zhí)行時(shí)間
- Django Celery異步任務(wù)隊(duì)列的實(shí)現(xiàn)
- Django中celery執(zhí)行任務(wù)結(jié)果的保存方法
- 使用celery執(zhí)行Django串行異步任務(wù)的方法步驟
- django celery redis使用具體實(shí)踐
- 詳解django+django-celery+celery的整合實(shí)戰(zhàn)
- Django實(shí)現(xiàn)celery定時(shí)任務(wù)過程解析
相關(guān)文章
Python遍歷指定文件夾下的所有文件名的方法小結(jié)
當(dāng)需要遍歷指定文件夾下的所有文件名時(shí),Python提供了多種方法來實(shí)現(xiàn)這個(gè)任務(wù),本文將介紹如何使用Python來完成這一任務(wù),有需要的小伙伴可以參考下2024-01-01
使用 Python 和 LabelMe 實(shí)現(xiàn)圖片驗(yàn)證碼的自動(dòng)標(biāo)注功能
文章介紹了如何使用Python和LabelMe自動(dòng)標(biāo)注圖片驗(yàn)證碼,主要步驟包括圖像預(yù)處理、OCR識(shí)別和生成標(biāo)注文件,通過結(jié)合PaddleOCR,可以快速實(shí)現(xiàn)驗(yàn)證碼字符的自動(dòng)標(biāo)注,大幅提升工作效率,感興趣的朋友一起看看吧2024-12-12
python監(jiān)控linux內(nèi)存并寫入mongodb(推薦)
這篇文章主要介紹了python監(jiān)控linux內(nèi)存并寫入mongodb的相關(guān)資料,需要的朋友可以參考下2017-09-09
分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了
這篇文章主要介紹了分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了一勞永逸,需要的朋友可以參考下2020-12-12

