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, redisMongoDB 等。

安装

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