检测和诊断工人静默崩溃

1 投票
1 回答
1988 浏览
提问于 2025-04-16 08:59

我在用守护进程的方式运行Celery 2,搭配RabbitMQ。偶尔会出现无声崩溃的情况,我在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 查看时,发现celery节点是正在运行的。

如果我执行 /etc/init.d/celeryd restart,celeryd的进程数量会翻倍。看起来旧的进程不再被守护进程控制了。

  1. 我该如何找出,为什么即使收到了任务,任务处理还是没有进行?
  2. 为什么旧的celeryd进程没有被 /etc/init.d/celeryd restart 杀掉?

1 个回答

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

撰写回答