Python 多处理:如何在异常时关闭多处理池



我正在使用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;

在给pool.close在除了块内它说

名称

错误:未定义全局名称"池">

我试图使用以下代码在异常上杀死该进程。

except Exception as e:
import os
import signal
pid = os.getpid()
os.kill(pid, signal.SIGTERM) 

但我仍然可以在服务器上看到该过程。这仍然不是最好的解决方案,因为这只会终止遇到异常的子进程,其他进程仍将继续进行。

我希望所有进程在完成后终止,无论它们是否遇到异常。

我正在运行 Python2.7

Ps:我无法在服务器上安装像 psutil 这样的新库,我正在尝试使用标准 python 库的解决方案。

我在这个论坛中检查了一些类似的问题,例如自动杀死过程和儿童,但它们并不是真正的问题。

我得到了解决方案-在父进程中捕获异常。

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

这将解决您的问题

相关内容

  • 没有找到相关文章

最新更新