Python Celery任务重启Celery工作者

7
在celery中,有没有一种简单的方法来创建一个或多个任务,以便我可以使用它们自动重新启动工作进程?目标是每次从github获取新源代码时,我的部署都会自动重新启动所有子celery工作进程。因此,我可以向该机器上的管理celery实例发送一个restartWorkers()任务,该任务将停止该机器上的所有celery工作进程(实际上是stopwait),并使用新模块重新启动它们。
计划是每台机器都有:
- 管理节点[队列:管理,特定于机器] - 负责管理机器上的其余工作进程,根据需要启动新节点并杀死旧节点 - 工作节点[队列:git修订特定,工作进程特定,特定于机器] - 实际负责执行工作
看起来我需要的代码在dist_packages/celery/bin/celeryd_multi.py的某个地方,但是启动工作进程的源代码相当不透明,我无法确定它应该如何工作或在哪里启动节点。(看起来shutdown_nodes是正确的代码来调用杀死进程,我正在缓慢地通过它来调试以弄清楚我的参数应该是什么)
是否存在重启节点(self, nodes)函数/函数,我可以调用它,还是我将从python内部运行shell脚本?
此外,是否有一种比杀死和重新启动进程更简单的方法来重新加载Python中的源代码?如果我知道重新加载模块实际上是有效的(实验表明它不是。对函数的更改不会传播,直到我重新启动进程),我将只是这样做而不是使用管理节点的间接方式。
编辑:我现在可以关机,感谢broadcast(谢谢mihael。如果我的声望更高,我会点赞)。有没有广播重启的方法?有pool_restart,但它不会杀死节点,这意味着它不会更新源代码。
我一直在研究celery.bin.celeryd:WorkerCommand().run()中的一些幕后源代码,但是在调用之前和之后都发生了一些奇怪的事情,因此我不能仅调用该函数并完成它,因为它会崩溃。从python脚本调用shell命令来运行另一个python脚本毫无意义,我无法相信我是第一个想要这样做的人。

有pool_restart,但它不会杀死节点,这意味着它不会更新源代码。真希望你有解决方案,但看起来它仍然没有解决。 - AlanSE
你如何管理你的工人?你使用systemd吗?你可以有一个execRestart任务并在部署结束时调用systemctl restart celery.service,例如。 - shalbafzadeh
那家公司在4年前已经破产了,所以现在已经不重要了,我也忘记了。 - Kevin Meyer
1个回答

2

一半的工作已经完成。我可以关闭,但是无法启动。谢谢。 - Kevin Meyer
pool_restart消息是否能胜任这项工作?可能它无法追赶新任务,但它会抓住现有任务的更新。我不确定Celery何时将符号任务名称绑定到特定的可调用函数。如果它发生在池本身中,那么重新启动它将解决您的任务问题,就我所知。 - Michael Korbakov
4
不行。定义了一个任务Add(x, y),返回x+y。启动了Celery。add.delay(4,4)返回8。将Add修改为返回x*y。执行broadcast('pool_restart')add.delay(4,4)仍然返回8而不是16。注意在--autoreload标志下也观察到了这种行为。 - Kevin Meyer
一种解决方案:如果您使用 supervisord 启动 worker,则可以调用“shutdown”广播命令,然后 supervisord 将自动重新启动 worker。 - asksol
找到了与Celery相关的配置设置:http://docs.celeryproject.org/en/latest/configuration.html#celeryd-pool-restarts - Michael Korbakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接