在超时错误时杀死所有子进程但不杀死父进程
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
构造函数似乎有些多余,因为无论如何您永远不会向任务池提交多个任务。
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
构造函数似乎有些多余,因为无论如何您永远不会向任务池提交多个任务。