1. celery介绍
1. celery是什么?
分布式异步任务框架:第三方框架。
项目中使用异步任务的场景,可以使用它
之前做异步,如何做?
异步发送短信 ----》 开启多线程 ----》 不便于管理
2.celery 有什么作用?
- 执行异步任务
- 执行延迟任务
- 执行定时任务
3. celery原理
- 1. 可以不依赖任何服务器,通过自身命令,启动服务
-2. celery服务为其他项目提供异步解决任务需求的
注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求
比如:
人是一个独立运行的服务 | 医院也是一个独立运行的服务
正常情况下,人可以完成所有的健康情况的动作,不需要医院的参与;但当人生病的时候,就会被医院接收,解决人生病问题。
人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求
django如果不用异步,正常运行即可,如果想做异步,就借助于celery来完成
4. celery架构
- broker:消息中间件,任务中间件(消息队列:redis,rabbitmq)
django要做异步,提交任务到 任务中间件中(redis) ,存储起来
celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成,包括,RabbitMQ,Redis等等
- worker:任务执行者,任务执行单元
不停的从任务中间件中取任务,执行
worker 是celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中
- banckend:结果存储,任务结果存储
把任务执行结果(函数返回值),存放到结果存储中(redis)
用来存储worker执行的任务的结果,celery 支持以不同的方式存储任务的结果,包括AMQP,redis等
2. celery的快速使用
1. celery是开源的,小组织,不支持win,win上使用:需要借助于第三方
2. 安装:pip install celery
- 安装的是最新版本:5.3.4
3. 写代码 main.py
1. 先导入celery,然后实例化得到对象
2. 编写任务,使用app.task装饰---》变成celery的任务
import time from celery import Celery # 1. 实例化得到对象 broker = 'redis://127.0.0.1:6379/1' # 消息中间件 :redis,1:表示redis的第一个库 backend = 'redis://127.0.0.1:6379/1' # 结果存储,用redis app=Celery('app',broker=broker,backend=backend) # 2. 编写任务,必须用app.task装饰,才变成了celery的任务 @app.task def send_sms(): time.sleep(1) print('短信发送成功') return '手机号短信发送成功'
# 3. 提交任务,使用别的线程
# 提交任务,使用别的进程 from main import send_sms # 1.同步执行 # res = send_sms() # print(res) # 2. 异步发送短信 # 返回结果不是send_sms的返回值,是一个任务id号 # 这个任务还没有被执行,只是提交到任务中间件中了(redis) res = send_sms.delay() print(res) # 346b7b90-31b1-4daa-8792-3112ea028df7 # 任务要执行,要启动worker --》 使用命令启动 ---》启动celery服务 # 在win上:要先安装: pip install eventlet
结果:redis的db1中,任务提交成功
4. 启动worker,可以在3之前
Windows:
- 1. 先安装:pip install eventlet
- 2. 执行命令,启动celery服务:
celery -A main worker -l info -P eventlet (路径要对,先切换到main.py所在路径下)
# 任务要执行,要启动worker --》 使用命令启动 ---》启动celery服务 # 执行命令:celery -A tasks worker --loglevel=INFO # 在win上:要先安装: pip install eventlet # celery -A main worker -l info -P eventlet # 启动worker # mac,Linux: # celery -A main worker -l info
结果:
# 5 worker就会执行任务,把执行的结果,放到结果存储中
# 6. 获取结果
from celery.result import AsyncResult from main import app id = '346b7b90-31b1-4daa-8792-3112ea028df7' if __name__ == '__main__': a = AsyncResult(id=id, app=app) if a.successful(): result = a.get() print(result) elif a.failed(): print('任务失败') elif a.status == 'PENDING': print('任务等待中被执行') elif a.status == 'RETRY': print('任务异常后正在重试') elif a.status == 'STARTED': print('任务已经开始被执行')
worker执行完任务之后:
当再次提交一个任务且 worker还没启动:
获取结果:
标签:异步,worker,redis,celery,任务,print From: https://www.cnblogs.com/Lucky-Hua/p/17773179.html