And*_*zub 6 python rabbitmq celery
我在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)'
Run Code Online (Sandbox Code Playgroud)
小智 3
看来您已达到 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
| 归档时间: |
|
| 查看次数: |
1039 次 |
| 最近记录: |