Celery配合Django處理異步任務(wù)

Celery的介紹及應(yīng)用場(chǎng)景:


Celery 是一個(gè) 基于python開發(fā)的分布式異步消息任務(wù)隊(duì)列士修,通過它可以輕松的實(shí)現(xiàn)任務(wù)的異步處理章贞, 如果你的業(yè)務(wù)場(chǎng)景中需要用到異步任務(wù)备埃,就可以考慮使用celery尼桶, 舉幾個(gè)實(shí)例場(chǎng)景中可用的例子:

你想對(duì)100臺(tái)機(jī)器執(zhí)行一條批量命令节槐,可能會(huì)花很長(zhǎng)時(shí)間 搀庶,但你不想讓你的程序等著結(jié)果返回,而是給你返回 一個(gè)任務(wù)ID,你過一段時(shí)間只需要拿著這個(gè)任務(wù)id就可以拿到任務(wù)執(zhí)行結(jié)果铜异, 在任務(wù)執(zhí)行ing進(jìn)行時(shí)哥倔,你可以繼續(xù)做其它的事情。?

你想做一個(gè)定時(shí)任務(wù)揍庄,比如每天檢測(cè)一下你們所有客戶的資料咆蒿,如果發(fā)現(xiàn)今天 是客戶的生日,就給他發(fā)個(gè)短信祝福

Celery 在執(zhí)行任務(wù)時(shí)需要通過一個(gè)消息中間件來接收和發(fā)送任務(wù)消息蚂子,以及存儲(chǔ)任務(wù)結(jié)果沃测, 一般使用rabbitMQ or Redis,后面會(huì)講

注冊(cè)需要驗(yàn)證郵箱,但是發(fā)郵件的時(shí)候有的用戶網(wǎng)絡(luò)環(huán)境比較差食茎,為了提升用戶使用體驗(yàn)蒂破,我們需要使用一個(gè)可以異步執(zhí)行郵件的發(fā)送任務(wù)的工具、



Celery的工作原理:

celery通過消息進(jìn)行通信别渔,通常使用一個(gè)叫Broker(中間人)來協(xié)client(任務(wù)的發(fā)出者)和worker(任務(wù)的處理者). clients發(fā)出消息到隊(duì)列中寞蚌,broker將隊(duì)列中的信息派發(fā)給worker來處理。

??一個(gè)celery系統(tǒng)可以包含很多的worker和broker钠糊,可增強(qiáng)橫向擴(kuò)展性和高可用性能。



安裝配置:

1.使用python的包管理器pip來安裝: pip install -U Celery

2.從官方直接下載安裝包:https://pypi.python.org/pypi/celery/

Ubuntu系統(tǒng)下操作:

tar xvfz celery-0.0.0.tar.gz

cd celery-0.0.0

python setup.py build

python setup.py install

Broker中間人:

1.RabbitMQ

RabbitMQ是一個(gè)功能完備壹哺,穩(wěn)定的并且易于安裝的broker. 它是生產(chǎn)環(huán)境中最優(yōu)的選擇抄伍。使用RabbitMQ的細(xì)節(jié)參照以下鏈接:http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#broker-rabbitmq

如果我們使用的是Ubuntu或者Debian發(fā)行版的Linux,可以直接通過下面的命令安裝RabbitMQ:sudo apt-get install rabbitmq-server? ? 安裝完畢之后管宵,RabbitMQ-server服務(wù)器就已經(jīng)在后臺(tái)運(yùn)行截珍。如果您用的并不是Ubuntu或Debian, 可以在以下網(wǎng)址:http://www.rabbitmq.com/download.html去查找自己所需要的版本軟件攀甚。

2.Redis

Redis也是一款功能完備的broker可選項(xiàng),但是其更可能因意外中斷或者電源故障導(dǎo)致數(shù)據(jù)丟失的情況岗喉。關(guān)于是有那個(gè)Redis作為Broker秋度,可訪下面網(wǎng)址:http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#broker-redis



Django中快速入門Celery:

創(chuàng)建django項(xiàng)目celery_demo:?????????? django-admin startproject celery_demo

創(chuàng)建應(yīng)用demo:???????????????????????????????? python manage.py startapp demo

在celery_demo模塊中創(chuàng)建celery.py模塊內(nèi)容為:

from celery import Celery from django.conf import settings import os

# 為celery設(shè)置環(huán)境變量os.environ.setdefault('DJANGO_SETTINGS_MODULE','celery_demo.settings')

# 創(chuàng)建應(yīng)用

app = Celery("demo")

# 配置應(yīng)用

app.conf.update(# 配置broker, 這里我們用redis作為brokerBROKER_URL='redis://:332572@127.0.0.1:6379/1',)

# 設(shè)置app自動(dòng)加載任務(wù)# 從已經(jīng)安裝的app中查找任務(wù)app.autodiscover_tasks(settings.INSTALLED_APPS)

在應(yīng)用demo引用創(chuàng)建tasks.py模塊在文件內(nèi)創(chuàng)建一個(gè)任務(wù)函數(shù)my_task代碼為:

from celery_demo.celery import app

import time

# 加上app對(duì)象的task裝飾器# 此函數(shù)為任務(wù)函數(shù)

@app.task

def my_task():

?????? print("任務(wù)開始執(zhí)行....")

?????? time.sleep(5)

?????? print("任務(wù)執(zhí)行結(jié)束....")

在views.py模塊中創(chuàng)建視圖index:

from django.shortcuts import render

from django.http import HttpResponse

from .tasks importmy_task

def index(request):

# 將my_task任務(wù)加入到celery隊(duì)列中如果my_task函數(shù)有參數(shù),可通過delay()傳遞 例如????????????? #my_task(a, b), my_task.delay(10, 20)

?????? my_task.delay()

??????? returnHttpResponse("服務(wù)器返回響應(yīng)內(nèi)容钱床!")

在celey_demo/settings.py配置視圖路由:

from django.conf.urls import url

from django.contrib import admin

fromdemo.views import index url patterns = [? ? url(r'^admin/', admin.site.urls),? ? url(r'^$', index),]

創(chuàng)建worker等待處理celery隊(duì)列中任務(wù), 在終端執(zhí)行命令:

celery -A celery_demo worker -l info

啟動(dòng)django測(cè)試服務(wù)器:

python manage.py runserver

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荚斯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子查牌,更是在濱河造成了極大的恐慌事期,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纸颜,死亡現(xiàn)場(chǎng)離奇詭異兽泣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)胁孙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門唠倦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涮较,你說我怎么就攤上這事稠鼻。” “怎么了法希?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵枷餐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我苫亦,道長(zhǎng)毛肋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任屋剑,我火速辦了婚禮润匙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唉匾。我一直安慰自己孕讳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布巍膘。 她就那樣靜靜地躺著厂财,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峡懈。 梳的紋絲不亂的頭發(fā)上璃饱,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音肪康,去河邊找鬼荚恶。 笑死撩穿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谒撼。 我是一名探鬼主播食寡,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼廓潜!你這毒婦竟也來了抵皱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤茉帅,失蹤者是張志新(化名)和其女友劉穎叨叙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堪澎,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂错,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樱蛤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钮呀。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昨凡,靈堂內(nèi)的尸體忽然破棺而出爽醋,到底是詐尸還是另有隱情,我是刑警寧澤便脊,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布蚂四,位于F島的核電站,受9級(jí)特大地震影響哪痰,放射性物質(zhì)發(fā)生泄漏遂赠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一晌杰、第九天 我趴在偏房一處隱蔽的房頂上張望跷睦。 院中可真熱鬧,春花似錦肋演、人聲如沸抑诸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜕乡。三九已至,卻和暖如春梗夸,著一層夾襖步出監(jiān)牢的瞬間异希,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留称簿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓惰帽,卻偏偏與公主長(zhǎng)得像憨降,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子该酗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容