Python多处理,在循环中多次使用池,在第一次迭代后陷入困境

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

我有下面的情况,我在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
操作。我怀疑生成了僵尸进程,或者进程以某种方式被
切换了
。下面您将找到我迄今为止尝试过的所有内容

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'
子句中。