7

我有以下情况,我在 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的多处理库文件的链接

4

1 回答 1

1

我假设您正试图通过某个函数调用它,这不是使用它的正确方法。

您需要将其包裹起来:

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

于 2018-07-06T12:39:39.040 回答