使用exitcode零调试芹菜WorkerLostError(Heroku上的Django 1.5.5 +芹菜3.1.8 + RabbitMQ 3.1.3)

时间:2014-12-23 00:40:30

标签: django heroku rabbitmq celery

我的平台经历了很多任务(每天几千个)。其中一些较长的任务因以下错误而失败:

Traceback (most recent call last):
  File "/app/.heroku/python/lib/python2.7/site-packages/billiard/pool.py", line 1167, in mark_as_worker_lost
    human_status(exitcode)),
WorkerLostError: Worker exited prematurely: exitcode 0.

根据Celery's Flower的说法,它没有提供任何比追踪回溯更多的东西,这项任务在开始前四分钟收到(2014-12-22 22:46:46.196814)(2014-12-22 22: 50:03.469647),仅在十秒内失败(纪元1419288613.34或2014-12-22 22:50:13)。

这是我平台上反复出现的问题。它发生主要是,其任务运行scrapy 0.24.2,但也可能与其他任务一起发生。

WorkerLostError的其他持续时间(退出代码为零)是三分钟,五分钟或七分钟。

有关可能导致此问题的任何想法?所有任务在本地运行完美。感谢。

3 个答案:

答案 0 :(得分:7)

我的建议是检查您正在使用的所有模块以及“raise BaseException”的代码。我遇到了WorkerLostError exitcode 0的问题。

经过大量调试并特别确定任务失败的地方后,我发现是在引发BaseException的时候。发生了WorkerLostError,而不是提供错误消息。

通过更改为“raise Exception”,当任务内部出现问题时,会提供实际的错误消息。对于你的情况,这可能不一样,但这是我在处理相同错误时发现的。

答案 1 :(得分:1)

我也注意到了同样的错误:

[...ERROR/MainProcess] Task ... raised unexpected: WorkerLostError('Worker exited prematurely: exitcode 0.',)
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/site-packages/billiard/pool.py", line 1175, in mark_as_worker_lost
    human_status(exitcode)),
billiard.exceptions.WorkerLostError: Worker exited prematurely: exitcode 0.

不仅包含BaseException,还包含BaseException子类的自定义异常。将基类更改为Exception允许将实际异常与堆栈跟踪一起提升。

答案 2 :(得分:0)

对我来说,它sys.exit(0)在任务中