我正在使用芹菜3.X和RabbitMQ后端。有时它需要重新启动celery(将新的源代码更新推送到服务器)。但是在循环内部有一个大循环和try / catch的任务;完成任务可能需要几个小时。如果我将其停止并且稍后将重新启动它,将不会发生任何关键事件。
问题:问题是每次我停止工作后(通过sudo service celeryd stop)我必须手动杀死任务(通过 kill -9 );任务忽略来自worker的SIGTERM 。我读过Celery docs& Stackoverflow但我找不到工作解决方案。任何想法如何解决问题?
答案 0 :(得分:0)
发送退出信号将stop workers immediately:sudo service celeryd stop -QUIT
如果CELERY_ACKS_LATE设置设置为True,则当工作人员停止时,工作人员停止时运行的任务将再次运行。
答案 1 :(得分:-1)
Celery不打算运行长任务,因为它只会阻止工作人员执行任务。我建议重新安排你的逻辑,让任务调用自己而不是循环。一旦关闭正在进行,您当前的任务将完成,并将在芹菜关闭之前停止的同一点恢复。
此外,将任务拆分为块,您将能够将任务转移到另一个工作人员/主持人,这可能是您将来想要做的事情。