如何杀死进程重启的芹菜工作进程

时间:2016-09-21 18:41:20

标签: python multithreading sockets celery python-multiprocessing

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

该套接字类还使用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)

但芹菜工人主管流程进入快速旋转,创建芹菜工人流程,立即退出,而不是在几次尝试后放弃和死亡。

是否有一种更好的方式来表明芹菜工作过程中芹菜工人死亡的信号?

1 个答案:

答案 0 :(得分:0)

我有类似的问题。我最终创建了一个单独的脚本来管理工人。

创建一个无限的while循环,休眠所需的时间,然后创建/杀死工作进程。

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