在 Celery 中,最终重新加载模块的唯一方法是重新启动所有 celery 进程。我知道如何远程关闭工作人员(broadcast('shutdown', destination = [<workers>])
),但不知道如何让他们恢复。
我有一段 Python 代码可以用来创建一个包含新工作者的守护进程,但是当我尝试在 Celery 中将它作为 celery 任务运行时,我得到了AssertionError: daemonic processes are not allowed to have children
,我猜这与工人池已建立。
- 有没有办法以某种方式覆盖芹菜中的这个错误?
- 如果没有,是否有另一种方法可以让 Celery 启动另一个工人来代替自己?也许将整个事情包装在一个 bash 脚本中(尽管在 Python 中这样做的目的是避免使用 Python 调用 bash 来调用 Python)。
- 如果没有,还有其他方法可以说服 Celery 重新加载最新版本的代码吗?旗帜
--autoreload
,broadcast('pool_restart')
两者都不做。
示例行为:
创造:
@task def add(x,y): 返回 x+y
加载 celery,运行 add.delay(4,4),返回 8。
更改添加到:
@task def add(x,y): 返回 x*y
做魔术(目前是“重启芹菜”)
再次运行 add.delay(4,4)
你应该回到 16。我总是回到 8,除非我关闭 celery 并重新加载它,如果没有办法从远程机器上调出工作进程,我就无法远程完成,最好是使用脚本。