Dav*_*eAl 7 python ubuntu multiprocessing python-multiprocessing pathos
我遇到以下情况,我在 for 循环中创建一个池,如下所示(我知道这不是很优雅,但出于酸洗原因我必须这样做)。假设pathos.multiprocessing相当于 python 的multiprocessing库(因为它涉及到一些与此问题无关的细节)。我想执行以下代码:
self.pool = pathos.multiprocessing.ProcessingPool(number_processes)
for i in range(5):
all_responses = self.pool.map(wrapper_singlerun, range(self.no_of_restarts))
pool._clear()
Run Code Online (Sandbox Code Playgroud)
现在我的问题:循环成功运行第一次迭代。然而,在第二次迭代时,算法突然停止(没有完成操作pool.map。我怀疑生成了僵尸进程,或者该进程以某种方式存在switched。下面您将找到我迄今为止尝试过的所有内容。
for i in range(5):
pool = pathos.multiprocessing.ProcessingPool(number_processes)
all_responses = self.pool.map(wrapper_singlerun, range(self.no_of_restarts))
pool._clear()
gc.collect()
for p in multiprocessing.active_children():
p.terminate()
gc.collect()
print("We have so many active children: ", multiprocessing.active_children()) # Returns []
Run Code Online (Sandbox Code Playgroud)
上面的代码在我的 Mac 上运行得很好。但是,当我将其上传到具有以下规格的集群时,我收到错误,它在第一次迭代后卡住了:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS"
Run Code Online (Sandbox Code Playgroud)
这是pathos的多处理库文件的链接
我假设您试图通过某个函数来调用它,但这不是使用它的正确方法。
您需要用以下内容将其包裹起来:
if __name__ == '__main__':
for i in range(5):
pool = pathos.multiprocessing.Pool(number_processes)
all_responses = pool.map(wrapper_singlerun,
range(self.no_of_restarts))
Run Code Online (Sandbox Code Playgroud)
如果你不这样做,它将继续创建自身的副本,并开始将其放入堆栈中,最终将填满堆栈并阻止所有内容。它在 mac 上运行的原因是它有 fork,而 windows 没有。