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