我在Heroku上运行Celery工作,其中一项任务达到了超时限制。当我手动重试它时一切正常,所以这可能是一个连接问题。我使用RabbitMQ作为代理,Celery被配置为对任务进行延迟确认(CELERY_ACKS_LATE = True)。我希望将任务返回到RabbitMQ队列并由另一个工作人员再次处理,但它没有发生。当工作人员超时时,我是否需要为任务配置其他任何东西以返回RabbitMQ队列?
以下是日志:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.4/site-packages/billiard/pool.py", line 639, in on_hard_timeout
raise TimeLimitExceeded(job._timeout)
billiard.exceptions.TimeLimitExceeded: TimeLimitExceeded(60,)
[2015-09-02 06:22:14,504: ERROR/MainProcess] Hard time limit (60s) exceeded for simulator.tasks.run_simulations[4e269d24-87a5-4038-b5b5-bc4252c17cbb]
[2015-09-02 06:22:18,877: INFO/MainProcess] missed heartbeat from celery@420cc07b-f5ba-4226-91c9-84a949974daa
[2015-09-02 06:22:18,922: ERROR/MainProcess] Process 'Worker-1' pid:9 exited with 'signal 9 (SIGKILL)'
答案 0 :(得分:2)
看起来你正在达到Celery的时间限制。 http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits
Celery默认情况下不会为任务实现重试逻辑,因为它不知道重试是否对您的任务是安全的。也就是说,您的任务需要是重要的,以便安全重试。
因此,任务失败都应该在任务中进行。请参阅此处的示例:http://docs.celeryproject.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.retry
您的任务可能超时的原因有几个,但您最了解。 任务可能已经超时,因为处理数据花费的时间太长,或者因为获取数据花费的时间太长。
如果您认为任务尝试连接某些服务失败,我建议减少连接超时间隔并在任务中添加重试逻辑。如果您的任务处理数据的时间太长,请尝试以块的形式拆分数据并以此方式处理。 Celery对此有很好的支持:http://docs.celeryproject.org/en/latest/userguide/canvas.html#chunks