什么是celery

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。

.在上图user指的是flask、Djangao这一些框架发送的一些请求
.AMQP broker指的是中间件,我们可以用RabbitMQ或者Redis来承担相关工作。
.celery workers指的就是celery,它作为消费者监听中间件中的任务,这里就需要用到并发的操作了,
celery实现了并发(进程+协程)
.task result store在这里就是进行存储

Celery的组成

Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。

1.消息中间件(message broker):
Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ,Redis等等。

2.任务执行单元(worker):
Worker是Celery提供的任务执行的单元, worker并发的运行在分布式的系统节点中。

3.任务结果存储(task result store):
Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP,redis等

Celery的安装以及使用

安装就直接pip就可以了
pip install celery

使用过程很简单

  1. 确定异步任务函数,通过命令确定之后,生产者会把函数名和相关参数传给消息中间件。
  2. 通过一条命令把celery启动,实现celery workers对消息队列的监听。

演示

我们使用redis来进行演示,在这里redis有两个作用,一个是消息中间件,一个是存储结果的数据库。
我们创建了一个项目celerypro
我们创建了一个异步任务执行文件celery_task

import celery
import time
backend='redis://127.0.0.1:6379/1'    # 设置redis的1数据库来存放结果
broker='redis://127.0.0.1:6379/2'      # 设置redis的2数据库存放消息中间件
cel=celery.Celery('test',backend=backend,broker=broker)
    # 参数说明:第一个是celery的名字,这个celery和哪个项目相关就命名哪个
    # 后面两个关键字参数则是指定消息中间件和结果存放位置。

#定义的函数
@cel.task
def send_email(name):
    print("向%s发送邮件..."%name)
    #延迟时间
    time.sleep(5)
    print("向%s发送邮件完成"%name)
    return "ok"

@cel.task
def send_msg(name):
    print("向%s发送短信..."%name)
    time.sleep(5)
    print("向%s发送短信完成"%name)
    return "ok"

启动celery

接下来就是使用命令启动celery
celery --app=demo worker -l INFO
这里的demo是你要执行的文件名

当正确的时候就是这样的

当然可能会报错这是因为在celery用到了协程,协程在使用的使用需要用猴子补丁,具体解决方式是,首先下载eventlet:
pip install eventlet
如何命令进行修改
celery --app=celery_task worker -l INFO -P eventlet
当然还有一种错误

这是因为你的redis版本太低了,需要重新下载

执行测试

创建一个新的文件,来进行异步函数的测试

from celery_task import send_email, send_msg
#调用发送邮箱函数
result1 = send_email.delay("张三")
#进行打印
print(result1.id)
result2 = send_email.delay("李四")
print(result2.id)
result3 = send_msg.delay("王五")
print(result3.id)
result4 = send_msg.delay("赵六")
print(result4.id)

我们执行之后会得到一个

运行的结果不是异步函数的返回值,而是一个id值,因为celery会将函数进行异步处理,结果会存放到指定的数据库中,而我们取值的时候就需要用id值了

获取值

当我们拿到id之后就要获取他的一个执行过程
创建一个新的文件

from celery.result import AsyncResult
from celery_task import cel

async_result=AsyncResult(id="275f43a8-a5bb-4822-9a90-8be3feeb3b4", app=cel)

if async_result.successful():
    result = async_result.get()
    print(result)
    # result.forget() # 将结果删除
elif async_result.failed():
    print('执行失败')
elif async_result.status == 'PENDING':
    print('任务等待中被执行')
elif async_result.status == 'RETRY':
    print('任务异常后正在重试')
elif async_result.status == 'STARTED':
    print('任务已经开始被执行')
posted on 2022-04-06 14:28  一纸荒年003  阅读(173)  评论(0编辑  收藏  举报