编程语言
首页 > 编程语言> > Python多处理:如何在异常时关闭多处理池

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之后

NameError: global name ‘pool’ is not defined

我尝试使用以下代码终止Exception上的进程.

    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块看起来多余,但事实并非如此.
原因是,子进程引发的一些异常并没有抛给父进程.

例如,我在函数中引发了一个自定义异常并且没有抛出到父进程,因此建议捕获子进程中的所有异常并从那里引出标准异常,然后在父进程处理它,您可以关闭进程池或进行其他清理.

标签:python,multiprocessing,kill-process
来源: https://codeday.me/bug/20190701/1349859.html