Python芹菜任务重启芹菜工人

时间:2013-01-21 21:14:55

标签: python celery celeryd

在celery中,是否有一种简单的方法可以创建一系列(可用于)自动重启工作者的任务?

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

计划适用于每台机器:

  • 管理节点[队列:管理,特定于机器] - 负责管理机器上的其余工作人员,根据需要启动新节点并删除旧节点
  • 工作节点[队列:特定于git版本,特定于工作人员,特定于机器] - 实际上负责工作。

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

我可以调用某个函数/函数restart_nodes(self,nodes)或者我将从python中运行shell脚本吗?

/另外,是否有更简单的方法将源重新加载到Python而不是杀死并重新启动进程?如果我知道重新加载模块实际上有效(实验说它没有。在重新启动过程之前,函数的更改不会渗透),我只是这样做,而不是管理节点的间接。

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

我一直在研究celery.bin.celeryd:WorkerCommand()。run()中的一些幕后资源,但是在运行调用之前和之后都有一些奇怪的事情发生,所以我不能只需调用该函数即可完成,因为它崩溃了。从python脚本调用shell命令运行另一个python脚本是有道理的,我无法相信我是第一个想要这样做的人。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用Celery的broadcast functionality

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