使用multiprocessing.pool.Pool初始化并行处理会无限期冻结

时间:2019-03-25 20:45:16

标签: python parallel-processing anaconda spyder

我目前正在尝试从anaconda的spyder控制台运行并行化的代码。我认为问题可能出在我的计算机不允许anaconda控制CPU内核,但是我不确定如何解决此问题。

另一个有趣的一点是,当我运行一个异步示例时,但是当我尝试产生结果时,我遇到了同样的问题。

我尝试了多个应该起作用的简单示例。没有包裹加载错误

from multiprocessing.pool import ThreadPool, Pool

def square_it(x):
    return x*x

# On Windows, make sure that multiprocessing doesn't start
# until after "if __name__ == '__main__'" 

with Pool(processes=5) as pool:
     results = pool.map(square_it, [5, 4, 3, 2 ,1])

print(results) 

我希望我的代码能完成所有代码。

1 个答案:

答案 0 :(得分:2)

此代码旨在在5个不同的进程中并行运行square_it

def square_it(x):
    return x*x

with Pool(processes=5) as pool:
    results = pool.map(square_it, [5, 4, 3, 2 ,1])

print(results)

这样做的目的是创建5个新进程,然后在每个进程中加载​​相同的python模块并调用函数square_it

在5个子流程之一中导入模块时会发生什么,与最初在主流程中加载模块时发生的事情相同:它会创建5个子流程中的另一个Pool,它们会无限期地执行该操作。 / p>

为避免这种情况,您必须确保子流程不会递归地创建越来越多的子流程。您可以通过仅在“主”模块(也称为"__main__")中创建子流程来做到这一点:

def square_it(x):
    return x*x

if __name__ == "__main__":
    with Pool(processes=5) as pool:
         results = pool.map(square_it, [5, 4, 3, 2 ,1])

    print(results)