我有一个Python程序,它产生一个子进程,而该子进程又打开了一个子进程池。主程序在子流程结束之前退出(在现实世界中,这是一个Flask应用程序,可快速关闭连接并返回可用于监视子流程并将其发送到该子流程的流程ID)。
我希望能够用一个简单的命令杀死创建池的进程以及池中的所有子进程。看来daemon
的{{1}}选项就是为了做到这一点。但是,Python documentation明确指出
请注意,不允许守护进程创建子进程。
这意味着我无法通过守护第一个子进程来控制池的寿命。
此示例代码重现了我的问题:
Process()
执行#!/usr/bin/env python3
from multiprocessing import Process, Pool
from random import random
from time import sleep
def subsub(i):
t = random() * 4 + 1
print(f"Running #{i} for {t} seconds...")
sleep(t)
print(f"#{i} Done.")
def sub():
with Pool(processes=4) as pool:
pool.map(subsub, range(10))
pool.close()
pool.join()
if __name__ == '__main__':
ps = Process(target=sub)
ps.start()
sleep(1)
print("Killing...")
ps.terminate()
之后,子进程将继续运行并产生(它们抛出ps.terminate()
,因为父进程已死)。
我是否有办法一枪杀死BrokenPipeError
和sub
(可以将已经运行的subsub
实例放开直到它们退出)?
谢谢。