Celery的apply_async()无法正常工作的解决方案之一

本文探讨了Celery异步任务丢失的问题,通过排查发现僵尸进程导致任务分配失败。文章提供了具体的解决方案,包括检查和关闭多余进程的Shell命令,确保Celery任务正确执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文由Markdown语法编辑器编辑完成。

1. 问题提出

任务队列是一种在线程或机器间分发任务的机制。
消息队列的输入是工作的一个单元,称为任务,独立的职程(Worker)进程持续监控队列中是否有需要处理的新任务。

Celery用消息通信,通常使用中间人(Broker)在客户端和职程间斡旋。这个过程从客户端向队列添加消息开始,之后中间人把消息派送给职程。

Celery系统可包含多个职程和中间人,以此获得高可用性和横向扩展能力。

Celery需要一个发送和接收消息的传输者。RabbitMQ和Redis中间人的消息传输支持所有特性。

Celery的常见API中,有一个常用的是 apply_async()。从接口的名称中可以看出,它是用于处理异步任务的。即调用者并不太关心这个任务的执行结果,只需要把接到的任务丢出去,让一个进程去执行任务即可。

最近在使用apply_async()这个接口时,发现出现了故障,就是丢进去的任务,似乎丢失了,就是没有后续的动作了,就像将一个石头丢进了大海里,消失了。一直百思不得其解。因为同样的处理程序,用同步的写法,就没有问题;一用异步的调用,就没有结果了。很是恼火。

于是开始在网上找一些帖子,将关于Celery的apply_async()的一些调用方法。后来找到一个帖子,是关于查看和关闭正在启动着的celery进程的。

然后,我就用帖子中的shell指令,查看了一下当前正在运行的celery进程。然后,我就被屏幕中满屏的celery程序给震惊了。我之前明明已经把运行的celery的程序,通过Ctrl + C的方式,关闭了。为什么还会有这么多没有被关闭的celery进程呢。

同时,问题基本上也明了了。就是因为有很多的僵尸celery程序在运行着,导致我丢出去的异步任务,被不知道哪个celery的进程给截获了,而导致我这边始终无法开始运行任务。

2. 问题解决

因此,解决这个问题,就是两个步骤。
首先,查看当前正在进行的celery进程;

ps aux | grep celery

然后,关闭这些所有正在运行着的celery进程,之后再去运行原来出问题的程序,就可以正常的,用celery的apply_async()进行异步调用了。

pkill -f celery

即可解决该问题。

同时,以后如果再遇到类似的问题时,也要优先想到,有可能是当前的任务起了多个进程,其中有一部分是之前不知道什么原因未被正常结束的僵尸进程。他们一直启动着,但是却无法真正工作,还会影响其他的任务。因此,最好是查询一下,是否有在启动着的进程。

参考链接:

  1. Celery文档:
    http://docs.jinkan.org/docs/celery/getting-started/introduction.html
  2. How to stop celery worker process
    https://inneka.com/programming/python/how-to-stop-celery-worker-process/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inter_peng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值