Celery介绍
-
1.Celery介绍
- 点击查看Celery参考文档
- Celery是一个功能完备即插即用的任务队列
- Celery适用异步处理问题,比如发送邮件、文件上传,图像处理等等比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验
-
2.Celery特点:
- 简单,易于使用和维护,有丰富的文档
- 高效,单个Celery进程每分钟可以处理数百万个任务
- 灵活,Celery中几乎每个部分都可以自定义扩展
- Celery非常易于集成到一些web开发框架中
-
3.安装Celery
# 进入虚拟环境 pip install celery
-
4.Celery组成结构
- 任务队列是一种跨线程、跨机器工作的一种机制
- 任务队列中包含任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理
- Celery通过消息进行通信,通常使用一个叫broker(中间人)来协client(任务的发出者)和worker(任务的处理者)
- client发出消息到队列中,broker将队列中的信息派发给worker来处理
- 一个Celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能。
-
Celery组成结构是生产者消费者模型的一种体现
Celery使用
1.创建Celery异步任务文件
创建名称为celery_tasks文件夹
2.创建应用对象/客户端/client
在celery_tasks目录下创建main.py文件,用于作为celery的启动文件
- 创建Celery对象
- 参数main是异步任务路径
from celery import Celery
#创建Celery对象
#参数main 设置脚本名
app = Celery('celery_tasks')
#加载配置文件
app.config_from_object('celery_tasks.config')
3.中间人broker
- 示例:此处演示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_tasks目录下创建config.py文件,用于保存celery的配置信息
broker_url = "redis://127.0.0.1/14"
result_backend = "redis://127.0.0.1/15"
修改main.py ,让celery对象加载配置文件
from celery import Celery
#创建Celery对象
#参数main 设置脚本名
app = Celery('celery_tasks')
#加载配置文件
app.config_from_object('celery_tasks.config')
4.创建任务,并让celery检测
- 添加任务,在celery_tasks包中创建sms包,并创建tasks文件(这个task是我写的抢购优惠券一个任务)
-
from __future__ import absolute_import, unicode_literals from django.utils import timezone from django.db import transaction from celery_tasks.main import app from django_redis import get_redis_connection from rest_framework import status, serializers from rushtobuy.models import Orders, Coupon, Users #可以设置name参数 @app.task(name='rush_to_coupon') def rush_to_coupon(coupon_id, user_id): # try: redis_conn = get_redis_connection('default') count_number = int(redis_conn.hget('coupon', coupon_id)) if coupon_id == 1 and count_number >= 80: return elif coupon_id == 2 and count_number >= 150: return elif coupon_id == 3 and count_number >= 300: return else: # 生成任务号,设置管道 pl = redis_conn.pipeline() count_number += 1 pl.hset('coupon', coupon_id, count_number) task_id = ('%06d%04d' % (int(user_id), int(count_number))) pl.execute() return task_id
- Celery检测任务
-
from celery import Celery #创建Celery对象 #参数main 设置脚本名 app = Celery('celery_tasks') #加载配置文件 (这个config配置文件是用来配置celery的) app.config_from_object('celery_tasks.config') #自动加载任务 app.autodiscover_tasks(['celery_tasks.coupon'])
5.创建worker
- 示例:此处演示把worker创建到ubuntu虚拟机中,ubuntu作为Celery服务器
- 添加配置
from celery import Celery
#进行Celery允许配置
# 为celery使用django配置文件进行设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'mall.settings'
#创建Celery对象
#参数main 设置脚本名
app = Celery('celery_tasks')
#加载配置文件
app.config_from_object('celery_tasks.config')
#自动加载任务
app.autodiscover_tasks(['celery_tasks.sms'])
- 在虚拟环境中添加指令执行
#我们需要指令让Celery单独执行
#需要在虚拟环境中执行
# celery -A celery对象的路径 worker -l info
# celery -A celery_tasks.main worker -l info