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

时间:2019-09-26 17:27:44

标签: python macos celery celery-task

我有一个芹菜工人,它为每个传入的任务产生一个新的过程。

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

当芹菜进程由于SIGKILL或冷关机而终止时,它启动的Python进程将继续运行。即使在进程层次结构中,macOS也会说父进程不再存在。当父进程意外终止时,子进程也不应该被杀死吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

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

github question goes into a bit more detail,但tldr的意思是Celery被设计为不会在父进程被杀死的情况下意外杀死子进程,以防子进程需要在执行父进程之后完成。例如,一个告诉其他任务更新各种数据库的任务。调用父级后,您可以打开父级工作进程,但是如果停止父级工作组,则不一定希望终止子进程。

我使用此功能直接杀死子进程:

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 )