【发布时间】:2017-11-19 03:18:40
【问题描述】:
我正在使用 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:未定义全局名称“池”
我尝试使用以下代码终止异常进程。
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,但它们并不是真正的问题。
【问题讨论】:
-
在调用
pool.close()之前,您是否尝试使用r.get()获取结果?我认为在调用pool.map()后,在您获得结果之前,这些进程不会退出。哦,您不应该尝试从子进程中触摸pool对象,如文档所述:Note that the methods of a pool should only ever be used by the process which created it. -
谢谢@Maciek,我通过将整个父进程代码放在 try ... except 块中得到了解决方案。在下面分享它作为答案。
标签: python multiprocessing kill-process