1.Celery介绍
点击查看Celery参考文档
Celery是一个功能完备即插即用的任务队列
Celery适用异步处理问题,比如发送邮件、文件上传,图像处理等等比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验
2.Celery特点:
简单,易于使用和维护,有丰富的文档
高效,单个Celery进程每分钟可以处理数百万个任务
灵活,Celery中几乎每个部分都可以自定义扩展
Celery非常易于集成到一些web开发框架中
3.Celery组成结构
任务队列是一种跨线程、跨机器工作的一种机制
任务队列中包含任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理
Celery通过消息进行通信,通常使用一个叫broker(中间人)来协client(任务的发出者)和worker(任务的处理者)
client发出消息到队列中,broker将队列中的信息派发给worker来处理
一个Celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能。
Celery组成结构是生产者消费者模型的一种体现
Celery使用
一、安装Celery
# 进入虚拟环境
pip install celery==4.1.0
二、创建Celery异步任务文件 tasks.py
三、创建应用对象/客户端/client
应用对象内部封装要异步执行的任务
Celery():
参数1是异步任务路径
参数2是指定的broker
redis://密码@redis的ip:端口/数据库
redis://192.168.243.191:6379/4
返回客户端应用对象app
send_active_email():内部封装激活邮件内容,并用装饰器@app.task注册
调用python的send_mail()将激活邮件发送出去
代码参考:
#定义任务函数:
from celery import Celery
from django.core.mail import send_mail
from django.conf import settings
# 创建celery应用对象
app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/1')
@app.task
@app.task
def send_active_email(username, receiver, token):
"""封装发送邮件方法"""
subject = "天天生鲜用户激活" # 标题
message = "" # 邮件正文(纯文本)
sender = settings.EMAIL_FROM # 发件人
receivers = [receiver] # 接收人, 需要是列表
# 邮件正文(带html样式)
html_message = '<h2>尊敬的 %s, 感谢注册天天生鲜</h2>' \
'<p>请点击此链接激活您的帐号: ' \
'<a href="http://127.0.0.1:8000/users/active/%s">' \
'http://127.0.0.1:8000/users/active/%s</a>' \
% (username, token, token)
send_mail(subject, message, sender, receivers, html_message=html_message)
#注册发送邮件代码修改:
class RegisterView(View):
"""注册"""
def post(self, request):
...
# 业务处理
# 保存用户到数据库中
try:
user = User.objects.create_user(username=username,
password=password,
email=email)
except IntegrityError:
return render(request, 'register.html', {'message': '用户名已存在'})
# todo: 发送激活邮件
token = user.generate_active_token()
# send_active_email(username, email, token)
# 使用celery异步发送激活邮件
send_active_email.delay(username, email, token)
# 响应请求,返回html页面
return HttpResponse("进入登录界面")
四、中间人broker
启动Redis作为中间人:
sudo redis-server /etc/redis/redis.conf
说明:
示例:此处演示Redis数据库作为中间人broker Celery需要一种解决消息的发送和接受的方式,我们把这种用来存储消息的的中间装置叫做message 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
五、Celery服务器创建worker步骤
把项目代码拷贝一份到桌面
修改项目代码: 在celery_tasks/tasks.py文件顶部添加以下代码, 作用:让Celery的worker能够加载Django配置环境。 注意: 服务器端的代码才需要添加
# 添加到celery服务器所在电脑的项目中,
# 让celery执行发送邮件前初始化django环境
import os
import django
# 设置环境变量
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
# 初始化django环境
django.setup()
from celery import Celery
from django.core.mail import send_mail
from django.conf import settings
# 创建celery应用对象
app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/1')
...
进入到桌面的项目中,启动celery服务器(worker)
# 在虚拟环境下执行
celery -A celery_tasks.tasks worker -l info