如何杀死 celery 工作进程以重新启动进程

rdr*_*rey 5 python sockets multithreading celery python-multiprocessing

我有一个 celery 工作进程,它在celery.signals.worker_process_init. 如果无法建立连接并引发异常,则 celery Worker 将无法启动,这是预期的行为。

该套接字类还使用threading.Timer. 不幸的是,由于计时器线程没有特殊的异常处理,因此如果连接发生问题,我的工作线程不会退出。

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

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

下一次尝试,我看到它在celery/billiard问题中的某处提到:

raise SystemExit("Socket error")  # Same, I guess
Run Code Online (Sandbox Code Playgroud)

这有效:

os.kill(os.getpid(), signal.SIGHUP)
Run Code Online (Sandbox Code Playgroud)

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

有没有更好的方法从 celery 任务外部发出 celery 工作进程死亡信号?

Chi*_*and 0

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

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

while True:
    time.sleep(5)
    # create workers if possible
    # kill stale workers if not required.
Run Code Online (Sandbox Code Playgroud)