Python 多处理:如何在异常时关闭多处理池
Python multiprocessing: How to close the multiprocessing pool on exception
我正在使用 python 多处理来并行拆分一个较长的进程和 运行。它工作正常,除非其中一个子进程出现异常,在这种情况下,进程池没有关闭,我仍然可以在服务器上看到这些进程。
代码如下:
from multiprocessing import Pool
pool = Pool(processes=4)
from functools import partial
param_data = "Test Value"
func = partial(test_function, param_data)
r = pool.map(func, range(3))
pool.close()
def test_function(param_data,index):
try:
# The process here;
except Exception as e:
# Close the process pool;
在 except 块中给出 pool.close
时它说
NameError: global name 'pool' is not defined
我尝试使用以下代码终止异常进程。
except Exception as e:
import os
import signal
pid = os.getpid()
os.kill(pid, signal.SIGTERM)
但我仍然可以在服务器上看到进程。这仍然不是最好的解决方案,因为这只会终止遇到异常的子进程,其他进程仍将继续。
我希望所有进程在完成时终止,无论它们是否遇到异常。
我是运行宁Python2.7
Ps:我无法在服务器上安装像 psutil 这样的新库,我正在尝试使用标准 python 库的解决方案。
我在这个论坛中检查了几个类似的问题,例如 auto kill process and child,但它们并不是真正的问题。
我找到了解决方案 - 在父进程中捕获异常。
try:
pool = Pool(processes=4)
from functools import partial
param_data = "Test Value"
func = partial(test_function, param_data)
r = pool.map(func, range(3))
except Exception as e:
pool.close()
pool.close()
并且还在子进程函数中添加一个try/catch:
def test_function(param_data,index):
try:
# The process here;
except Exception as e:
raise Exception(e.message)
这里的except块看起来是多余的,其实不然。
原因是子进程抛出的一些异常没有抛给父进程。
例如,我在函数中引发了一个自定义异常,它没有被抛给父进程,所以建议在子进程中捕获所有异常并从那里引发标准异常,然后处理它在父进程中,您可以关闭进程池或进行其他清理。
你必须使用:
删除池
后
Pool.terminate & Pool.join
这将解决您的问题
我正在使用 python 多处理来并行拆分一个较长的进程和 运行。它工作正常,除非其中一个子进程出现异常,在这种情况下,进程池没有关闭,我仍然可以在服务器上看到这些进程。
代码如下:
from multiprocessing import Pool
pool = Pool(processes=4)
from functools import partial
param_data = "Test Value"
func = partial(test_function, param_data)
r = pool.map(func, range(3))
pool.close()
def test_function(param_data,index):
try:
# The process here;
except Exception as e:
# Close the process pool;
在 except 块中给出 pool.close
时它说
NameError: global name 'pool' is not defined
我尝试使用以下代码终止异常进程。
except Exception as e:
import os
import signal
pid = os.getpid()
os.kill(pid, signal.SIGTERM)
但我仍然可以在服务器上看到进程。这仍然不是最好的解决方案,因为这只会终止遇到异常的子进程,其他进程仍将继续。
我希望所有进程在完成时终止,无论它们是否遇到异常。
我是运行宁Python2.7
Ps:我无法在服务器上安装像 psutil 这样的新库,我正在尝试使用标准 python 库的解决方案。
我在这个论坛中检查了几个类似的问题,例如 auto kill process and child,但它们并不是真正的问题。
我找到了解决方案 - 在父进程中捕获异常。
try:
pool = Pool(processes=4)
from functools import partial
param_data = "Test Value"
func = partial(test_function, param_data)
r = pool.map(func, range(3))
except Exception as e:
pool.close()
pool.close()
并且还在子进程函数中添加一个try/catch:
def test_function(param_data,index):
try:
# The process here;
except Exception as e:
raise Exception(e.message)
这里的except块看起来是多余的,其实不然。 原因是子进程抛出的一些异常没有抛给父进程。
例如,我在函数中引发了一个自定义异常,它没有被抛给父进程,所以建议在子进程中捕获所有异常并从那里引发标准异常,然后处理它在父进程中,您可以关闭进程池或进行其他清理。
你必须使用: 删除池 后 Pool.terminate & Pool.join
这将解决您的问题