Celery的初步使用
1. 简介
Celery是由Python开发、简单、灵活、可靠的分布式任务队列,其本质是生产者消费者模型,Django的请求处理过程都是同步的无法实现异步任务,若要实现异步任务处理需要通过其他方式(前端的一般解决方案是ajax操作),而后台Celery就是不错的选择。
优点:
- 简单:熟悉celery的工作流程后,配置使用简单
- 高可用:当任务执行失败或执行过程中发生连接中断,celery会自动尝试重新执行任务
- 快速:一个单进程的celery每分钟可处理上百万个任务
- 灵活:几乎celery的各个组件都可以被扩展及自定制
2. 工作原理
Task
任务: 有异步任务和定时任务
Broker
消息中间件Broker,,接收Task,将任务存到队列。RabbitMQ、Redis、Amazon SQS、MongoDB、Memcached 等又可以做中间人。
Worker
任务执行单元,负责从消息队列中取出任务执行,它可以启动一个或者多个,也可以启动在不同的机器节点,这就是其实现分布式的核心。
Backend
结果存储,RabbitMQ、 Redis、Memcached,SQLAlchemy, Django ORM、Apache Cassandra、Elasticsearch都可以作为储存方式
3. 安装使用
这里我使用的是redis作为消息中间件
3.1 Celery安装
pip install -U Celery
3.2 简单使用:
项目目录
在项目文件夹下创建一个python package 文件夹,取名为celert_tasks,创建一个main.py文件和config.py文件,最后创建发送email的任务的文件夹,在里面在创建一个task.py文件,目录如下。
config.py :Celery相关配置文件
config.py里面的内容需要大写,还有redis的数据库不要用已经被使用过的
# 配置文件
BROKER_URL = 'redis://127.0.0.1/5'
main.py 文件内容:
# 启动文件
from celery import Celery
# 告知celery 使用django的配置文件进行配置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = "shanghuiproject.settings.dev"
# 创建应用
app = Celery('shanghui')
# 导入celery的配置文件
app.config_from_object('celery_tasks.config')
# 任务
app.autodiscover_tasks(['celery_tasks.msg','celery_tasks.email'])
# 终端启动任务
# celery -A 任务模块名 worker -l info
创建模块任务
之前在celery_tasks文件夹中创建新的文件夹email和msg分别用来存放发送验证邮件和短信的任务
以发送验证邮件为例子
在email文件夹里创建tasks.py文件:
# 在当前的tasks里面书写邮件发送任务
from django.core.mail import send_mail
from django.conf import settings
from celery_tasks.main import app
@app.task(name='send_mail')
def send_email(email, url):
print('进入send_email任务')
subject = '新的传奇' # 邮件主题
message = '点击链接激活邮箱:' # 邮件内容
sender = settings.EMAIL_FROM # 邮件发送者
receiver = [email,] # 接收邮件的邮箱
url_string = '<a href=' + url + '>点击链接</a>'
send_mail(subject=subject, message=message, from_email=sender, recipient_list=receiver,html_message=url_string)
去对应的 serializers.py 文件 修改代码:
from celery_tasks.email.tasks import send_email
url = 'http://127.0.0.1:8000/users/varifyemail/?token='+token
to_email = validated_data['email']
try:
send_email.delay(to_email, url)
except Exception as e:
print(e)
在终端输入下面代码启动工作者
celery -A 任务模块名 worker -l info