1. 定义
celery 3部分组成:
消息中间件(broker)
- 生产者消费者模型
- django生产者执行业务,订单来了,数据放到消息队列(rq),消费者监听队列,回调函数完成发送短息
一分钟有100个请求,100个请求入消息队列,回调任务完成100次,大量IO操作,一个2s,完成后再取第二个,重复这个步骤会耽误大量IO时间,第200个人需要200s才能有短信通知。
- rabbitmq+redis
执行任务单元(worker)
- 任务执行的单元,worker并发的运行在分布式的系统结点中。
任务执行结果存储(task result store)
- 存储worker的结果
2. 应用场景
异步任务:将耗时的操作任务提交给celery执行
定时任务:定时执行某件事情,每天统计数据
3. 异步任务实现
pip install eventlet
pip install redis
pip install celery
用celery实现以下流程:
方法.delay方法——就实现了生产者的全部工作
# 生产者
# 导入异步任务
from celery_task import send_msg,send_mail
result = send_mail.delay('gyz')
print(result.id)
result = send_mail.delay('xxz')
print(result.id)
# 消费者
import celery
import time
backend = 'redis://127.0.0.1:6379/3' # 结果储存
broker = 'redis://127.0.0.1:6379/4' # 中间件
cel = celery.Celery('test',backend=backend,broker=broker)
@cel.task() # celery的实例对象,套上celery装饰器就变成了celery异步任务
def send_mail(name):
print("发送邮件to%s"%name)
time.sleep(10)
print("发送邮件to%s完成"%name)
return "OK"
@cel.task() # celery的实例对象,套上celery装饰器就变成了celery异步任务
def send_msg(msg):
print("发送信息to%s"%msg)
time.sleep(5)
print("发送信息to%s完成"%msg)
return "OK"
celery -A celery_task worker -l info -P eventlet -c 10
worker是进程、 -A是文件 、-l是日志
这条命令完成了:用celery连接消息中间件,创建队列、监听队列、启动多个worker
8个并发、1个任务
3.1 取异步结果
from celery_task import cel
from celery.result import AsyncResult
async_result = AsyncResult(id = 'a6984cf0-f29d-4bf3-83ad-7289431e712e',app=cel)
if async_result.successful():
result = async_result.get()
print(result)
elif async_result.failed():
print('fail')
elif async_result.status == 'PENDING':
print('任务等待中被执行')
elif async_result.status == 'RETRY':
print('异常后重试')
else:
print('任务开始被执行')