如何杀掉Celery工作进程以进行进程重启

5

我有一个Celery工作进程,在celery.signals.worker_process_init中创建一个到外部服务器的套接字。 如果无法建立连接并引发异常,则Celery工作程序将无法启动,这是预期的行为。

该套接字类还使用threading.Timer发送偶尔的心跳包。不幸的是,由于Timer线程没有特殊的异常处理,如果连接出现问题,我的工作程序将不会停止。

我开始捕获来自套接字读写操作的异常,并尝试了许多方法来优雅地停止当前工作进程:

sys.exit(1)  # Doesn't kill the worker process (because it's running in a thread?)

接下来的尝试,我发现在celery/billiard问题中提到了它:

raise SystemExit("Socket error")  # Same, I guess

这个有效:

os.kill(os.getpid(), signal.SIGHUP)

但是,Celery工作进程监控进程会快速旋转并创建立即退出的Celery工作进程,而不是在尝试几次后放弃并死亡。

有没有更好的方法从外部信号终止Celery工作进程?

1个回答

0

我遇到了类似的问题。最终我创建了一个单独的脚本来管理工作进程。

创建一个无限循环,等待所需时间,然后创建/杀死工作进程。

while True:
    time.sleep(5)
    # create workers if possible
    # kill stale workers if not required.

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