通知 celery 任务在工作人员关闭期间停止

Posted

技术标签:

【中文标题】通知 celery 任务在工作人员关闭期间停止【英文标题】:Notify celery task to stop during worker shutdown 【发布时间】:2014-04-13 14:49:29 【问题描述】:

我正在使用 celery 3.X 和 RabbitMQ 后端。有时它需要重新启动 celery(将新的源代码更新推送到服务器)。但是有一个大循环的任务和循环内的try/catch;完成任务可能需要几个小时。如果我将其停止并稍后重新启动,则不会发生任何严重的事情。

问题:问题是每次我停止工人后(通过 sudo service celeryd stop)我都必须手动 KILL 任务(通过 kill -9);任务忽略来自工人的 SIGTERM。我读过 throw Celery docs & *** 但我找不到有效的解决方案。任何想法如何解决这个问题?

【问题讨论】:

请看***.com/questions/8138642/… @venkatesh-bachu 我看到了这个,但情况不同。那篇关于如何在任务完成后进行清洁的帖子。我的问题是当我停止工作时如何停止/终止任务中的长(认为是无限)循环。 ps auxww | grep '芹菜' | awk '打印 $2' | xargs kill -9 使用此命令可以一次杀死所有进程,如果您想将此命令与 fab 一起使用,否则您可以在将代码推送到机器后重新启动机器 @venkatesh-bachu 是的,我使用它,但它更像是“黑客”。我想找到我的问题的永久解决方案:) @VenkateshBachu 例如,这不是具有自动缩放功能的分布式环境的解决方案。重启很少是真正的解决方案。 【参考方案1】:

发送QUIT信号将stop workers immediately:sudo service celeryd stop -QUIT

如果 CELERY_ACKS_LATE 设置为 True,则在工作人员停止时正在运行的任务将在工作人员重新启动时再次运行。

【讨论】:

这是一个已知的错误,有望在 Celery 4.0.3 中得到修复......发生的情况是,即使任务完成,他们也不承认它(当 acks_late 为 True 时)...... 【参考方案2】:

Celery 不适合运行长时间的任务,因为它只会阻止工作人员执行您的任务。我建议重新安排你的逻辑,让任务自己调用而不是循环。一旦关闭正在进行中,您当前的任务将完成,并将在 celery 关闭之前停止的同一点恢复。

此外,将任务拆分为多个块,您将能够将任务转移到另一个工作人员/主机,这可能是您将来想做的事情。

【讨论】:

以上是关于通知 celery 任务在工作人员关闭期间停止的主要内容,如果未能解决你的问题,请参考以下文章

Django 学习之Celery(芹菜)

php怎么调用celery任务

记录更新的 CloudKit 推送通知停止工作

停止 Redis 后如何继续执行 celery 队列,然后再启动它?

Django / Celery中的哨兵登录停止工作

多个工作节点上的 Django + Celery 任务