如果定期任务在芹菜中终止,如何将其排入队列?

How to enqueue a periodic task if it gets terminated in celery?

假设有一个定期任务安排在每小时 运行。工作人员收到任务并开始处理。在处理任务时,celeryd 进程(通过 supervisord 控制)重新启动(supervisorctl restart all)。即使任务从未完成执行,也不会重新执行。

如何立即重新排队周期性任务并防止多个版本的任务同时出现运行?

可能有更好的方法,但是您可以只使用周期性任务在队列中创建一个常规任务(例如,my_actual_task.defer(…))在完成之前不会从队列中删除(假设您使用的是 acks_late)。

如果您不使用 acks_late,您可以尝试将大部分任务放在一起,并在相应的 finally 中放置一个 my_actual_task.retry().

无论哪种方式,您通常都应该避免杀死工人而不给他们机会完成他们正在做的事情。