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应用就完成了