Celery的介绍及应用场景:
Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子:
你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。
你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福
Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redis,后面会讲
注册需要验证邮箱,但是发邮件的时候有的用户网络环境比较差,为了提升用户使用体验,我们需要使用一个可以异步执行邮件的发送任务的工具、
Celery的工作原理:
celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的信息派发给worker来处理。
一个celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能。
安装配置:
1.使用python的包管理器pip来安装:
pip install -U Celery
2.从官方直接下载安装包:https://pypi.python.org/pypi/celery/
Ubuntu系统下操作:
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是一个功能完备,稳定的并且易于安装的broker. 它是生产环境中最优的选择。使用RabbitMQ的细节参照以下链接:http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#broker-rabbitmq
如果我们使用的是Ubuntu或者Debian发行版的Linux,可以直接通过下面的命令安装RabbitMQ:sudo apt-get install rabbitmq-server 安装完毕之后,RabbitMQ-server服务器就已经在后台运行。如果您用的并不是Ubuntu或Debian, 可以在以下网址:http://www.rabbitmq.com/download.html去查找自己所需要的版本软件。
2.Redis
Redis也是一款功能完备的broker可选项,但是其更可能因意外中断或者电源故障导致数据丢失的情况。关于是有那个Redis作为Broker,可访下面网址:http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#broker-redis
Django中快速入门Celery:
创建django项目celery_demo: django-admin startproject celery_demo
创建应用demo: python manage.py startapp demo
在celery_demo模块中创建celery.py模块内容为:
from celery import Celery from django.conf import settings import os
# 为celery设置环境变量os.environ.setdefault('DJANGO_SETTINGS_MODULE','celery_demo.settings')
# 创建应用
app = Celery("demo")
# 配置应用
app.conf.update(# 配置broker, 这里我们用redis作为brokerBROKER_URL='redis://:332572@127.0.0.1:6379/1',)
# 设置app自动加载任务# 从已经安装的app中查找任务app.autodiscover_tasks(settings.INSTALLED_APPS)
在应用demo引用创建tasks.py模块在文件内创建一个任务函数my_task代码为:
from celery_demo.celery import app
import time
# 加上app对象的task装饰器# 此函数为任务函数
@app.task
def my_task():
print("任务开始执行....")
time.sleep(5)
print("任务执行结束....")
在views.py模块中创建视图index:
from django.shortcuts import render
from django.http import HttpResponse
from .tasks importmy_task
def index(request):
# 将my_task任务加入到celery队列中如果my_task函数有参数,可通过delay()传递 例如 #my_task(a, b), my_task.delay(10, 20)
my_task.delay()
returnHttpResponse("服务器返回响应内容!")
在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),]
创建worker等待处理celery队列中任务, 在终端执行命令:
celery -A celery_demo worker -l info
启动django测试服务器:
python manage.py runserver