测试之路 初探celery

哈喽大家好,接上期消息队列,本期内容就介绍下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)

运行效果如下图所示

806b6d944f51d1a4eead8738e30207e2.png

通过上面的操作。我们可以实现消费者与生产者的联系。并使数据得到处理并输出。那么如果我们想要得到回调函数的处理结果,该如何获取呢?

我们可以用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"
}

结语

本期内容就先到这里了。下期我们继续介绍他的复杂结构。以及相关配置。此处也有一些小坑的存在

好了。下期见~祝我的女神,节日快乐~

也祝各位女神们节日快乐~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值