关于用于python并行性的python Pool.map函数的说明

时间:2013-10-30 19:29:44

标签: python subprocess multiprocessing python-multithreading

关于以下代码片段的功能,我有几个问题。

 def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=10)             # start 10 worker processes
    result = pool.apply_async(f, [10])    # evaluate "f(10)" asynchronously
    print result.get(timeout=1)           
    print pool.map(f, range(10))          # prints "[0, 1, 4,..., 81]"
  1. pool = Pool(processes=10)行中,如果我在4处理器架构(四核)上运行并实例化4个以上的工作进程,它甚至会有所作为,因为最多只能执行4个进程在任何时间点?

  2. pool.map(f,range(10))函数中,如果我实例化10个工作进程,并且可能有50个映射器,python会在完成执行时处理为进程分配映射器,或者我应该弄清楚有多少映射器创建并实例化行pool = Pool(processes=number_of_mappers)中的许多进程?。

  3. 这是我第一次尝试并行化任何事情,我对此感到非常困惑。所以任何帮助都会非常感激。

    提前致谢!

2 个答案:

答案 0 :(得分:2)

  1. 如果您创建的工作进程多于可用CPU的工作进程数,那很好,但这些进程会相互竞争循环。也就是说,你将浪费更多的周期,因为专注于在流程之间切换的周期不会让你更接近完成。对于CPU绑定的任务,它只是浪费。但是,对于I / O绑定的任务,它可能正是您想要的,因为在这种情况下,进程将花费大量的时间空闲,等待阻止I / O完成。

  2. map函数自动切片可迭代参数并将其中的部分发送给所有工作进程。不过,我真的不知道mappers你的意思。您认为自己在示例中创建了多少mappers? 10? 1?别的什么?在你写的内容中,pool.map()会阻止所有工作完成。

答案 1 :(得分:1)

  1. 您可以创建比CPU可以执行的线程数更多的工作者。这在实时应用程序中是必需的,例如Web服务器,您必须确保每个客户端都能够与您通信而无需等待其他人。如果它不是一个实时应用程序而你只想尽快完成所有工作,那么创建尽可能多的线程会比你的CPU同时处理更明智。

  2. 无论您有多少工作,Python都会为工作人员分配工作。