我正在使用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
附言:我不能在服务器上安装像psutil这样的新库,我正在寻找使用标准python库的解决方案。
我查看了一些类似的问题,例如在此论坛中自动终止进程和子进程,但它们并没有真正解决这个问题。
pool.close()
之前,你尝试使用r.get()
获取结果了吗?我认为在调用pool.map()
后获取结果后,进程才会退出。哦,还有,你不应该尝试从子进程中访问pool
对象,因为文档说:请注意,池的方法只能由创建它的进程使用。
- Maciek