python - 检测和诊断无声崩溃的 worker

标签 python django celery

我正在使用守护进程运行 Celery 2 - http://ask.github.com/celery/cookbook/daemonizing.html与 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 杀死?

最佳答案

队列worker被停滞,所以解决这个问题的主要方法是调整每个任务的任务时间限制,当任务超过这个时间时重新启动worker。

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

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

关于python - 检测和诊断无声崩溃的 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4526211/

相关文章:

python - Pygame.error : Video system not initialized, python.display.update错误

django - 相关模型 ID 在 valid_data 中丢失,即使它存在于请求中

django - "Permission denied"尝试发送验证邮件时

python - 关闭开发服务器上的 Celery 任务延迟

python - 具有异步任务和redis的django中的线程安全

python - 为什么 `celery.current_app` 引用 Flask View 函数中的默认实例

python - 新手 Django 选择菜单 'function' 对象不可迭代

python - 如何将魔杖图像对象转换为 numpy 数组(没有 OpenCV)?

python - 如何编写包装预分配数据的扩展类型?

django - 使用 django channel 和 celery 收听 mqtt 主题