# celery: 分布式(放在多台机器)的 异步任务 框架
Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统
Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform.
# celery:能做什么事,解决什么问题?
异步任务---》项目中同步的操作,可以通过celery把它做成异步
延迟任务---》等一会再执行任务
定时任务---》每隔多长时间干什么事
如果你的项目仅仅想做定时任务,没有必要使用celery,使用apscheduler
-//www.cnblogs.com/xiao-xue-di/p/14081790.html
# 大白话理解celery
1)可以不依赖任何服务器,通过自身命令,启动服务
2)celery服务为为其他项目服务提供异步解决任务需求的
注:会有两个服务同时运行,一个是项目服务(django),一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求
人是一个独立运行的服务 | 医院也是一个独立运行的服务
正常情况下,人可以完成所有健康情况的动作,不需要医院的参与;但当人生病时,就会被医院接收,解决人生病问题
人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求
# 中间件:不是django中间件
中间件概念非常大
数据库中间件:应用程序和数据之间有一个东西
服务器中间件:web服务和浏览器之间有个东西:nginx
消息队列中间件:程序和程序之间:redis,rabbitmq
# celery架构图
broker:任务中间件,消息队列中间件,存储任务,celery本身不提供,需要借助第三方:redis,rabbitmq..
worker:任务执行单元,真正指向任务的进程,celery提供的
backend:结果存储,任务执行结果存在某个地方,借助于第三方:redis
2、快速使用
# 安装:
pip install celery
##### 第一步:写一个py文件,celery_task.py---》app实例化,写任务
from celery import Celery
# 消息中间件
broker = 'redis://127.0.0.1:6379/2'
# 结果存储
backend = 'redis://127.0.0.1:6379/1'
# 实例化得到对象
app = Celery('test', broker=broker, backend=backend)
# 写任务---》使用装饰器装饰一下变成celery的任务
@app.task
def add(a, b):
# import time
# time.sleep(1)
return a + b
##### 第二步:提交任务,应该是另一个服务,咱么写了一个py脚本提交
# 提交任务
from celery_task import add
# res=add(7,8) # 同步调用,一直等结果给我
# print(res)
# 异步调用
res = add.apply_async(args=[7, 8]) # 把任务提交到redis中的消息队列中了,任务中间件,消息队列中间件
print(res) # 任务id号:e7ef51e3-d71e-4028-93f9-b602d5351a20
##### 第三步:任务就被提交到redis中了,等待worker执行该任务,启动worker
# 启动worker执行任务---》使用命令启动
# 非windows
命令:celery -A celery_task worker -l info
# windows:
pip3 install eventlet
# 注意启动路径 cd到文件同级目录下
celery -A celery_task worker -l info -P eventlet
##### 第四步:任务被celery执行完了,结果放到redis中了,查询结果,使用代码 AsyncResult
# 通过代码把结果取出来
from celery_task import app # 借助于app
from celery.result import AsyncResult # 导入一个类,来查询结果
id = 'e8fc88cf-4246-43de-ab1d-25ea7e7145cc'
if __name__ == '__main__':
res = AsyncResult(id=id, app=app) # 根据id,去哪个app中找哪个任务,
if res.successful(): # 执行成功
result = res.get()
print('任务执行成功')
print(result) # 15
elif res.failed():
print('任务失败')
elif res.status == 'PENDING':
print('任务等待中被执行')
elif res.status == 'RETRY':
print('任务异常后正在重试')
elif res.status == 'STARTED':
print('任务已经开始被执行')