检测和诊断工人默默地崩溃

时间:2010-12-24 12:05:17

标签: python django celery

我正在使用带有RabbitMQ的守护进程 - http://ask.github.com/celery/cookbook/daemonizing.html运行Celery 2。 有时我会在celeryd.log中看到无声崩溃:

[2010-12-24 14:14:31,323: INFO/PoolWorker-1414] process shutting down
[2010-12-24 14:14:31,323: INFO/PoolWorker-1414] process exiting with exitcode 0
[2010-12-24 14:14:31,331: INFO/PoolWorker-1415] child process calling self.run()
[2010-12-24 14:14:48,673: INFO/MainProcess] Got task from broker: airsale.search.xxx.get_search_results[01bf5d36-7c0e-4f8a-af69-750ef1b24abc]
[2010-12-24 14:14:48,761: INFO/MainProcess] Got task from broker: airsale.search.xxx.get_search_results[2d5f9952-d493-4de4-9752-0eee1776147d]
[2010-12-24 14:14:48,861: INFO/MainProcess] Got task from broker: airsale.search.xxx.get_search_results[0c77c1ec-df6c-4e34-875c-44909fbf8b9f]
[2010-12-24 14:14:48,961: INFO/MainProcess] Got task from broker: airsale.search.xxx.get_search_results[3d83dd54-0be8-4cf9-9cd6-81e070d97170]
[2010-12-24 14:14:49,061: INFO/MainProcess] Got task from broker: airsale.search.xxx.get_search_results[2dd29e70-e085-4fd1-a7ef-12d06b21644c]
..........

然后 - 只有“来自经纪人的任务”而没有任何任务处理。

ps -C celeryd显示 - 芹菜节点正在运行。

如果我这样做:/etc/init.d/celeryd restart - 芹菜过程的数量增加一倍。似乎旧进程不再被守护进程控制。

  1. 如何检测 - 为什么不执行任务处理,即使是从经纪人处收到任务?
  2. 为什么旧的芹菜进程不被/etc/init.d/celeryd restart杀死?

1 个答案:

答案 0 :(得分:1)

队列工作人员停滞不前,因此解决此问题的主要方法是调整每项任务的任务时间限制,以便在任务超过此时间时重新启动工作人员。

将以下内容添加到您的任务中

from celery.decorators import task
from celery.exceptions import SoftTimeLimitExceeded


@task()
def mytask():
    try:
        do something()
    except SoftTimeLimitExceeded:
        clean something()
你的settings.py中的

添加以下内容

CELERYD_TASK_TIME_LIMIT = 30 #sec
CELERYD_TASK_SOFT_TIME_LIMIT = 30 #sec