在超时错误时杀死所有子进程但不杀死父进程

Kill All Child Processes But Not The Parent Processes Upon Timeout Error

while True:
    pid = os.getpid()
    try:
        pool = mp.Pool(processes=1, maxtasksperchild=1)
        result = pool.apply_async(my_func, args=())
        result.get(timeout=60)
        pool.close()
    except multiprocessing.context.TimeoutError:
        traceback.print_exc()
        kill_proc_tree(pid)

def kill_proc_tree(pid):
    parent = psutil.Process(pid)
    children = parent.children(recursive=True)
    for child in children:
        child.kill()

我正在使用多处理库,并且在每次 my_func 完成 运行、抛出异常或 运行 超过 60 秒(result.get(timeout=60) 应该抛出异常)。因为我想保留 while 循环 运行 但也避免有僵尸进程,我需要能够保留父进程 运行 但同时,如果抛出异常则杀死所有子进程在父进程或子进程中,或者子进程在生成新的 process.The kill_proc_tree 函数之前完成,我在网上找到的函数应该解决它最初似乎要做的问题(my_func 在进程开始时打开一个新的 window,并在进程应该结束时关闭 window),但后来我意识到在我的任务管理器中,Python 脚本仍在占用我的记忆力和足够多的 multiprocessing.context.TimeoutError 错误(它们由父进程抛出)之后,我的记忆力变满了。

那么我应该怎么做才能解决这个问题呢?任何帮助将不胜感激!

解决方案应该像调用池上的方法 terminate 一样简单,而不只是针对 TimeoutError,因为 result.get(timeout=60) 可以抛出任意异常,如果你的 my_func 在 60 秒之前完成,但出现异常。

请注意,根据文档,terminate 方法“在未完成未完成工作的情况下立即停止工作进程”,并且将在池的上下文处理程序退出时隐式调用,如下例所示:

import multiprocessing

while True:
    try:
        with multiprocessing.Pool(processes=1, maxtasksperchild=1) as pool:
            result = pool.apply_async(my_func, args=())
            result.get(timeout=60)
    except Exception:
        pass

maxtasksperchild=1 参数指定给 Pool 构造函数似乎有些多余,因为无论如何您永远不会向任务池提交多个任务。