当主进程终止时,Celery 启动的进程不会停止

Process started by Celery does not stop when main process is terminated

我有一个 celery worker,它为每个传入的任务生成一个新进程。

@app.task
def add(a, b):
    p = subprocess.Popen(args=['add', a, b], stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate()

当 celery 进程被 SIGKILL 或冷关机终止时,它启动的 Python 进程继续 运行。即使在进程层次结构中,macOS 也确实表示父进程不再存在。当父进程意外终止时,子进程不应该也被杀死吗?

简单的回答是否定的,如果您杀死父进程,子进程不会自动被杀死。

This github question goes into a bit more detail,但 tldr 是 Celery 被设计为在父进程被杀死时不会意外杀死子进程,以防子进程需要在父进程执行后完成。例如,告诉其他任务更新各种数据库的任务。 parent调用后可以开启parent worker,但不一定希望parent worker停止后子进程被kill掉。

我用这个函数直接杀死子进程:

from psutil import Process

def terminate_process(pid):

  process = Process(pid)
  for child in process.children(recursive=True):
    child.kill()
  process.kill()

你可以调用它直接从 PID 中杀死子进程。

celery_process_pid = celery_process.pid
terminate_process(celery_process_pid )