Celery没有在timeou之后将任务放回RabbitMQ队列

2024-09-30 10:39:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Heroku上运行芹菜工人,其中一个任务达到了超时限制。当我手动重试时,一切正常,所以可能是连接问题。我使用RabbitMQ作为代理,并将celeri配置为对任务进行延迟确认(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)' 

Tags: 代理heroku队列timeoutrabbitmqerror手动celery
1条回答
网友
1楼 · 发布于 2024-09-30 10:39:18

看来你已经到了芹菜的时间限制了。 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

您的任务可能会超时的原因有很多,但您最好知道。 任务可能已超时,因为处理数据的时间太长,或者获取数据的时间太长。在

如果您认为任务在尝试连接到某个服务时失败,我建议缩短连接超时时间间隔,并在任务中添加重试逻辑。如果您的任务处理数据的时间太长,请尝试将数据分成块并以这种方式进行处理。芹菜对此有很好的支持:http://docs.celeryproject.org/en/latest/userguide/canvas.html#chunks

相关问题 更多 >

    热门问题