Python多重处理,在循环中多次使用池,第一次迭代后卡住了

时间:2018-07-06 12:17:10

标签: 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()

现在是我的问题:循环成功运行了第一次迭代。但是,在第二次迭代中,算法突然停止(未完成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的多处理库文件

1 个答案:

答案 0 :(得分:0)

我假设您正在尝试通过某种函数调用此函数,而这不是使用此函数的正确方法。

您需要使用:

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没有。