我有一个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工作进程?