7

在 celery 中,有没有一种简单的方法来创建一个(一系列)任务,我可以用它来自动重启一个工作人员?

目标是让我的部署在每次从 github 获取新源时自动重新启动所有子 celery 工作人员。因此,我可以向该机器上的管理 celery 实例发送一个 restartWorkers() 任务,该任务将杀死(实际上是停止等待)该机器上的所有 celery 工作进程,并使用新模块重新启动它们。

该计划是让每台机器拥有:

  • 管理节点 [Queues: Management, machine-specific] - 负责管理机器上的其余工作人员,在必要时启动新节点并杀死旧节点
  • 工作节点 [队列:特定于 git 修订版、特定于工作人员、特定于机器] - 实际负责完成工作。

看起来我需要的代码在 dist_packages/celery/bin/celeryd_multi.py 中的某个位置,但是对于启动工作人员来说,源代码相当不透明,我不知道它应该如何工作或它实际上在哪里启动节点。(看起来shutdown_nodes是调用杀死进程的正确代码,我正在慢慢调试我的方式来弄清楚我的论点应该是什么)

是否有我可以调用的函数/函数 restart_nodes(self, nodes) 或者我将在 python 中运行 shell 脚本?

/另外,有没有比杀死和重新启动进程更简单的方法将源重新加载到 Python 中?如果我知道重新加载模块确实有效(实验表明它没有。在我重新启动该过程之前,对功能的更改不会渗透),我会这样做而不是间接使用管理节点。

编辑:我现在可以关闭,多亏了广播(谢谢 mihael。如果我有更多的代表,我会投票)。有什么方法可以广播重启?有 pool_restart,但这不会杀死节点,这意味着它不会更新源。

我一直在研究 celery.bin.celeryd:WorkerCommand().run() 中的一些幕后源代码,但是在 run 调用之前和之后发生了一些奇怪的事情,所以我不能只调用它功能并完成,因为它崩溃了。从 python 脚本调用 shell 命令来运行另一个 python 脚本只是 0 有意义,我不敢相信我是第一个想要这样做的人。

4

1 回答 1

2

您可以尝试使用Celery 的广播功能

在这里你可以看到一些很好的例子:https ://github.com/mher/flower/blob/master/flower/api/control.py

于 2013-01-22T00:26:32.653 回答