我有一个芹菜工作进程,它在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)
但芹菜工人主管流程进入快速旋转,创建芹菜工人流程,立即退出,而不是在几次尝试后放弃和死亡。
是否有一种更好的方式来表明芹菜工作过程中芹菜工人死亡的信号?
答案 0 :(得分:0)
我有类似的问题。我最终创建了一个单独的脚本来管理工人。
创建一个无限的while循环,休眠所需的时间,然后创建/杀死工作进程。
while True:
time.sleep(5)
# create workers if possible
# kill stale workers if not required.