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

时间:2015-05-16 07:08:38

标签: python celery blocking gevent

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

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

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

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

中的成功一样

有关详细信息,请查看https://github.com/celery/celery/issues/2621

3 个答案:

答案 0 :(得分:19)

如果您的芹菜工作者有时会卡住,您可以使用strace & lsof找出卡住的系统调用。

例如:

$ strace -p 10268 -s 10000
Process 10268 attached - interrupt to quit
recvfrom(5,

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)
......

它表示工作人员陷入了tcp连接(您可以在5u列中看到FD)。

某些python软件包如requests阻止等待来自对等方的数据,这可能导致芹菜工作者挂起,如果您使用requests,请确保设置timeout参数。< / p>

您是否看过此页:

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

答案 1 :(得分:1)

  

当我使用延迟shared_task与   芹菜,海带,amqp,台球。使用完后调用API   @shared_task的delay(),所有功能都很好,但是要延迟   它挂断了。

     

因此,问题出在主应用程序 init .py中,以下设置   失踪了

     

这将确保在#Django启动时始终导入应用程序,以便shared_task将使用此应用程序。

init .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']
  

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

     

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

     

也想提到A =另一个问题,如果有人遇到错误111   连接问题,然后请检查amqp == 2.2.2的版本,   台球== 3.5.0.3,芹菜== 4.1.0,海带== 4.1.0   支持与否。提到的版本只是一个例子。并且   检查系统中是否安装了redis(如果有的话,请使用redis)。

     

还要确保您正在使用Kombu 4.1.0。在最新版本中   Kombu将async重命名为异步。

答案 2 :(得分:0)

遵循本教程

Celery Django Link

在设置中添加以下内容

  

NB为传输和结果安装redis

   # TRANSPORT
   CELERY_BROKER_TRANSPORT = 'redis'
   CELERY_BROKER_HOST = 'localhost'
   CELERY_BROKER_PORT = '6379'
   CELERY_BROKER_VHOST = '0'

   # RESULT
   CELERY_RESULT_BACKEND = 'redis'
   CELERY_REDIS_HOST = 'localhost'
   CELERY_REDIS_PORT = '6379'
   CELERY_REDIS_DB = '1'