多处理“池”挂在正在运行的程序上

时间:2019-04-23 13:20:43

标签: python python-multiprocessing

我已经编写了一个程序来使用多处理python包中的“ Pool”,但是它一直挂在内核上。(顺便说一下,我正在将Jupyter与Anaconda一起使用)

我尝试使用导入的软件包(例如“ math”)中的函数,该函数运行良好,但是当我使用在同一python文件中创建的函数时,该函数不起作用。

import multiprocessing as mp

def f(x):
   for i in x:
      return i+1

ar=[1,2,3,4,5]
def main():
    pool=mp.Pool(processes=4)
    pool.map(f,ar)
if __name__== '__main__':
    main()

它表明内核正在运行,但CPU使用率为0%。

1 个答案:

答案 0 :(得分:0)

问题是ar不在您的主要功能的本地范围内,而是在其上方。放进去就可以了。

from multiprocessing import Pool

def f(x):
    return x+1

if __name__ == '__main__':
    ar=[1,2,3,4,5]
    with Pool(4) as p:
        print(p.map(f, ar))

也请考虑map占用了您的可迭代性并将其分配给各个流程,从本质上讲,它正在为您执行for循环。因此,您可以直接访问x。

最后,使用with作为上下文管理器可确保您的Pool在完成后关闭。 [docs]

编辑:我编辑并测试了上面的代码,我的发送了正确的值并正确关闭了。

此代码在Spyder 3.2.6和标准终端中也对我有用。这两个代码段均正确关闭,并且无法挂在我的计算机上。

import multiprocessing as mp

def f(x):
    return x+1

def main():
    ar = [1,2,3,4,5]
    pool = mp.Pool(processes=4)
    print(pool.map(f, ar))

if __name__ == '__main__':
    main()