繁体   English   中英

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

[英]Python multiprocessing, using pool multiple times in a loop gets stuck after first iteration

我有以下情况,我在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"

这是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没有它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM