芹菜工人挂起没有任何错误

Mad*_*ddy 7 python blocking celery gevent

我有一个生产设置,用于运行芹菜工作者对远程服务和存储结果发出POST/GET请求,它每15分钟处理大约20k个任务的负载.

问题是工人无缘无故麻木,没有错误,没有警告.

我也试过添加多处理,结果相同.

在日志中,我看到执行任务的时间增加,就像在s中成功一样

有关更多详细信息,请访问https://github.com/celery/celery/issues/2621

Gar*_*auh 27

如果您的芹菜工作者有时会卡住,您可以使用它strace & lsof来查明它被卡住的系统调用.

例如:

$ strace -p 10268 -s 10000
Process 10268 attached - interrupt to quit
recvfrom(5,
Run Code Online (Sandbox Code Playgroud)

10268是芹菜工人的pid,recvfrom(5意味着工人停止从文件描述符接收数据.

然后,您可以使用lsof检查5此工作进程中的内容.

lsof -p 10268
COMMAND   PID USER   FD   TYPE    DEVICE SIZE/OFF      NODE NAME
......
celery  10268 root    5u  IPv4 828871825      0t0       TCP 172.16.201.40:36162->10.13.244.205:wap-wsp (ESTABLISHED)
......
Run Code Online (Sandbox Code Playgroud)

它表示工作人员陷入了tcp连接(您可以5uFD列中看到).

一些python软件包requests阻止等待来自对等的数据,这可能导致芹菜工作者挂起,如果你正在使用requests,请确保设置timeout参数.


你看过这个页面了吗?

https://www.caktusgroup.com/blog/2013/10/30/using-strace-debug-stuck-celery-tasks/


Vin*_*mar 5

当我将延迟共享任务与芹菜、昆布、amqp、台球一起使用时,我也遇到了这个问题。当我对@shared_task 使用delay() 时调用API 后,所有功能都正常,但当它延迟时就会挂起。

所以,问题是在主应用程序init .py 中,缺少以下设置

这将确保在 Django 启动时始终导入该应用程序,以便共享任务将使用该应用程序。

初始化.py中

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celeryApp

#__all__ = ('celeryApp',)
__all__ = ['celeryApp']
    
Run Code Online (Sandbox Code Playgroud)

注意1:代替celery_app放置应用程序名称,表示celery.py中提到的应用程序导入应用程序并放在这里

注意2:**如果仅在共享任务中遇到挂起问题,上述解决方案可能会解决您的问题并忽略以下问题。

还想提一下 A=另一个问题,如果有人面临错误 111 连接问题,请检查 amqp==2.2.2、billiard==3.5.0.3、celery==4.1.0、kombu==4.1.0 的版本是否支持与否。提到的版本只是一个例子。并且还要检查您的系统中是否安装了redis(如果有使用redis)。

另请确保您使用的是 Kombu 4.1.0。在最新版本的 Kombu 中,将 async 重命名为 asynchronous。