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

本文由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/

你可能感兴趣的:(Linux(CentOS),Python,技术问题和解决)