我有一个芹菜工人,它为每个传入的任务产生一个新的过程。
@app.task
def add(a, b):
p = subprocess.Popen(args=['add', a, b], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
当芹菜进程由于SIGKILL或冷关机而终止时,它启动的Python进程将继续运行。即使在进程层次结构中,macOS也会说父进程不再存在。当父进程意外终止时,子进程也不应该被杀死吗?
答案 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 )