Python多处理,在循环中多次使用池,在第一次迭代后陷入困境
我有下面的情况,我在for循环中创建了一个池,如下所示(我知道这不是很优雅,但出于酸洗的原因,我不得不这样做)。假设Python多处理,在循环中多次使用池,在第一次迭代后陷入困境,python,ubuntu,multiprocessing,python-multiprocessing,pathos,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 = se
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
操作。我怀疑生成了僵尸进程,或者进程以某种方式被切换了
。下面您将找到我迄今为止尝试过的所有内容
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"
这是“多处理库文件是”我假设您试图通过某个函数调用它,但这不是正确的使用方法 您需要用以下内容来包装它:
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没有fork。嗨,我是
pathos
的作者。pathos。多处理
提供了一个增强的池
有两种方式:(1)更好的序列化,和(2)初始化。如果您只是在寻找更好的序列化,我建议您使用pathos.pool.\u ProcessPool
,它具有多处理的确切接口和规范,但具有更好的序列化。如果您正在寻找其他pathos
功能,那么您应该知道pathos除非明确销毁,否则代码>池将被保留。您必须执行池。\u清除或池。在上面使用的池上重新启动以终止(或重新启动)池。pathos.multiprocessing
中的接口已被弃用…首选接口是pathos.pools.ProcessPool
。该池应具有\u clear
和restart
方法。请注意,这是与pathos.multiprocessing.ProcessPool
和pathos.multiprocessing.Processin相同的对象gPool
…为了向后兼容,我把这两个工具都留了下来。调试您看到的东西很困难,因为您没有提供其他人可以运行的代码,您看到的错误会在哪里显示出来。您可以这样做吗?很难说您正在尝试做什么。如果是这样,您应该能够测试通过限制池中进程的数量,再加上执行清除
来关闭循环中的每个池
。这将限制活动进程的数量。您可以尝试进程池(1)
或类似的东西。@DaveTheAl你解决过挂起的问题吗?我相信我遇到过同样的问题。1)那么区别是name==“main”?不幸的是,我不能应用它,因为我的脚本只是另一个库的一个模块,它控制我的函数如何执行。2.)另一个不运行is的平台不是windows,而是ubuntu(在最后标记),您的主脚本,即您首先调用的主脚本,应该包装在一个if name=='main'
子句中。