Celery 简介
Celery是一个基于python开发的分布式异步消息任务队列,通过它可以请轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,可以使用celery
Celery场景
首先对该任务非常耗时,其次不注重结果。
如:短信业务,邮箱业务等。 (注意:如扣费,转账等就不能使用celery)
Celery介绍
Celery的框架有三部分组成 ,Broker (消息中间件) ,Worker (任务执行单元) ,Backend (任务结果存储)
Broker
- Celery本身不提供消息服务,但是可以和第三方提供的消息中间件(队列) 集成,如:RabbitMQ,Redis,KaFKa, 等 每当应用程序调用Celery的异步任务的时候吗,会向Broker传递消息,Broker会把当前传递来的Celery异步任务保存到 Broker中间件里 也可以叫做消息队列,而后worker将会获取消息。
Worker
- Worker是Celery的任务执行单元,worker并发的运行在分布式的系统节点中,执行Broker中的Celery的异步任务
Backend
- Backend用来存储worker执行任务的结果,Celery支持以不同方式存储任务的结果,包括Redis,MongoDB 等
如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-okQsEJBI-1589204089950)(/blog/img/celery.png)]
可以看到,Celery 主要包含以下几个模块:
- 任务模块 Task
包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。 - 消息中间件 Broker
Broker,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列。Celery 本身不提供队列服务,官方推荐使用 RabbitMQ 和 Redis 等。 - 任务执行单元 Worker
Worker 是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它。 - 任务结果存储 Backend
Backend 用于存储任务的执行结果,以供查询。同消息中间件一样,存储也可使用 RabbitMQ, redis 和 MongoDB 等。
安装
安装Rabbitmq
官方安装方法: http://www.rabbitmq.com/install-windows.html
centos系统安装-rabbitmq:hhttp://lql674470845.gitee.io/blog/post/centos-rabbitmq/
安装Celery ,使用(简单例子)
#安装celery
pip install celery
这里需要注意如果你的 celery 是 4.0 及以上版本请确保 python 的 redis 库版本在 2.10.4 及以上,否则会出现 redis 连接 timeout 的错误
- 创建一个tasks
#tasks.py
#导入celery
from celery import Celery
#我这里broker使用的是rabbitmq backend使用的是redis
app = Celery('tasks',broker='amqp://youusername:youpassword@ip:post',
backend="redis://:youpassword@ip/0")
#app.task装饰add函数成一个Task实例
@app.task
def add(x,y):
return x + y
OK,到这里,broker 我们有了,backend 我们有了,task 我们也有了,现在就该运行 worker 进行工作了,在 tasks.py 所在目录下运行
celery -A tasks worker -l info
#-A 参数指定创建的celery对象的位置,后面加worker表示该celery实例就是任务执行者
#-l 参数指定worker输出的日志级别
#注意如果你是用的是windows10系统运行celery4.x版本会出现错误
#解决办法是安装一个eventlet
pip isntall eventlet
#再次启动
celery -A tasks worker -l info -p eventlet
意思就是运行 tasks 这个任务集合的 worker 进行工作(当然此时broker中还没有任务,worker此时相当于待命状态)
最后一步,就是触发任务啦,最简单方式就是再写一个脚本然后调用那个被装饰成 task 的函数:
#trigger.py
from tasks import add
x = input('请输入x')
y = input('请输入y')
#不要直接 add(4, 4),这里需要用 celery 提供的接口 delay 进行调用
r = add.delay(int(x),int(y))
#获取结果 两者都可以获取
print("task_done",r.get())
print("task_done2",r.result)
运行此脚本
到此,一个简单的celery应用就完成了