哈喽大家好,接上期消息队列,本期内容就介绍下python操作消息队列的第三方包--celery
前言
上期简单叙述了一下消息队列的使用,并介绍了pika如何连接消息队列、操作消息队列。
直接操作消息队列比较费劲,有失python的优雅。强大的python库给我们提供了一个非常好用的工具--celery
下载
pip install celery
下载完成后,首先创建一个celer的实例。传入参数-->name,broker,backend
name:给celery实例起一个别名
broker:绑定消息中间件的url
backend:回调函数返回值的存储容器
import celery
# 消费者
'''
backend:表示存储结果的地方
broker:消息中间件的地址
cel:实例化celery对象
参数1:表示给celery起一个别名
参数2:绑定消息中间件
参数3:绑定返回值的存储容器
'''
backend = "redis://0.0.0.0:6379/1"
# 绑定mq
broker = "pyamqp://0.0.0.0:5673"
cel = celery.Celery("test", broker=broker, backend=backend)
创建完成后,我们就可以使用装饰器的方式定义消费者的回调函数了
# 定义函数,并用celery声明线程任务
@cel.task
def hello(name):
print(f"{name}说:你好")
sleep(5)
print(f"{name}说:下次见")
return "200"
如上,就完成消费者的定义。使用启动命令,将celery监听生产者发送过来的数据流
# celery -A xxx worker表示创建一个进程
# --loglevel表示日志等级
# --logfile表示log存放的日志
# 如果需要后台运行可以在后面增加-d 或者 --detach
# 后台运行停止的命令:celery -A your_celery_app control shutdown
celery -A myapp worker --loglevel=INFO --logfile=/var/log/celery.log
注意:这里有个小坑。如果消费者命令执行,存在层级关系。这里的myapp路径就需要使用app.myapp的行驶表示层级关系。另外如果存在导包错误,但是在确认路径没问题的情况下,仍会报错,可以使用python -m 的方式来运行脚本
python -m 表示将所要运行的包当做一个脚本去执行,效果如同在当前py文件下右键运行if name == 'main':的效果一致;它的底层原理是使用要运行的包名,通过sys.path去检索该包名,从而达到运行的效果
废话不多说。接下来就是生产者;
我们直接调用消费者装饰的函数,并使用该函数,调用delay("入参")函数。如下代码所示
# 生产者
from celery.result import AsyncResult
from celery_task import cel
'''创建任务.并绑定指定消费者函数.
1.send_msg和send_email是消费者里面的两个线程任务
可以看做是两个队列
2.delay是celery底层的调用方法.它实现了绑定队列.发
送任务等生产者需要做的一系列活动
'''
from celery_task import send_msg, send_email
cel_result = hello.delay("王昊")
# 将参数发送给消费者,会返回一个id。使用实例对象.id可以获取到该id。以便后续提取参数
print(cel_result.id)
运行效果如下图所示
通过上面的操作。我们可以实现消费者与生产者的联系。并使数据得到处理并输出。那么如果我们想要得到回调函数的处理结果,该如何获取呢?
我们可以用celery集成的redis来获取该参数
# 实例化一个result对象,将redis的key传进去,也就是生产者创建任务的id
# 然后绑定到指定的celer对象上面
async_result = AsyncResult(id="bddb57db-883d-4646-a85a-8c1da86ef33c", app=cel)
# celery的几种结果
if async_result.successful():
# 回去参数的value
result_ = async_result.get()
elif async_result.failed():
print("执行失败")
打开redis,我们也可以通过id。获取到指定的value
{
"status": "SUCCESS",
"result": "200",
"traceback": null,
"children": [],
"date_done": "2023-03-08T13:32:50.447923",
"task_id": "b900392e-17bc-4378-89f1-11693482f1ec"
}
结语
本期内容就先到这里了。下期我们继续介绍他的复杂结构。以及相关配置。此处也有一些小坑的存在
好了。下期见~祝我的女神,节日快乐~
也祝各位女神们节日快乐~~~