我有以下情况,我在 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()
现在我的问题:循环成功运行第一次迭代。但是,在第二次迭代时,算法突然停止(没有完成
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 []
上面的代码在我的 mac 上运行得很好。但是,当我将它上传到具有以下规范的集群时,我收到了第一次迭代后它卡住的错误:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS"
这是 the link to the 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))
如果您不这样做,它将继续创建自己的副本,并将开始将其放入堆栈,最终将填充堆栈并阻止所有内容。它在 mac 上工作的原因是它有 fork 而 windows 没有它。
关于Python多处理,在循环中多次使用池在第一次迭代后卡住,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51210305/