首页 > 解决方案 > Python多进程Pool的map方法

问题描述

def pool_process(f, data, pool_size):
    tp1 = time.time()
    pool = Pool(processes=pool_size)
    result = pool.map(f, data)
    pool.close()
    pool.join()
    print("Results", result)
    print("Overall Time:", round((time.time()-tp1),2))
    return round((time.time()-tp1),2)

def check_prime(num):
    print(multiprocessing.current_process(), multiprocessing.current_process().pid)
    t1 = time.time()
    res = False
    if num > 0:
        for i in range(2,num):
            if (num % i) == 0:
                print(num,"is not a prime number")
                print(i,"times",num//i,"is",num)
                print("Time:", int(time.time()-t1))
                break
        else:
            print(num,"is a prime number")
            print("Time:", time.time()-t1) 
            res = True
    return res

dataRange = range(10000)
pool_process(check_prime, dataRange, 6)

我正在尝试在 Jupiter notebook 中的 python 中测试这种多处理,该程序实际上以正常输出开始,并在几秒钟后冻结在那里。我认为代码不知何故卡在某个地方,所以我使用了 ps -elf | grep PID 在执行开始后检查其中一个进程的状态,我几乎一直得到 S,有时是 U,我不知道它是什么意思。然后,如果我使用 ps -elf | grep PID 稍后查看进程状态,没有任何痕迹,笔记本中的程序也没有结束。我用谷歌搜索了一些关于这个地图方法的东西,但仍然不知道发生了什么。如果有人可以帮助解决这个问题,我们将不胜感激。

标签: pythonmultiprocessing

解决方案


基本上,该Pool.map方法将一个函数(例如,f)和一个可迭代对象(例如, list [x, y, z])作为输入,并将该函数应用于可迭代对象中的每个项目,并返回一个新的可迭代对象(在本例中为 [f(x), f(y), f(z)])。

Pool.map方法与使用并行性的 vanillamap函数不同Pool.map,这就是为什么它是 Pool 对象的方法。(可选地,你也可以指定一个“chunksize”参数来告诉 Python 你想Pool.map如何分割工作,可以这么说。)

希望这可以帮助!

相关 Python 文档:https ://docs.python.org/3.8/library/multiprocessing.html#multiprocessing.pool.Pool.map


推荐阅读