Pool.map与Pool.map_async

时间:2016-10-04 02:21:47

标签: python multiprocessing

我有这样的程序:

from multiprocessing import Pool
import time

def f(x):
# I make a heavy code here to take time
  for i in range(10000):
     for i in range(10000):
        pass #do nothing

  print x #print x

if __name__ == '__main__':
  pool = Pool(processes=4)

  pool.map(f, range(10))
  r  = pool.map_async(f, range(10))

  # DO STUFF
  print 'HERE'
  print 'MORE'
  r.wait()
  print 'Done'

据我所知,pool.map将按顺序返回,而pool.map_async则不会。 我试图弄清楚它们之间的区别,但我还没有得到它。

实际上,我已阅读了一些帖子,例如:Python multiprocessing : map vs map_async

但我仍然感到困惑。 我的问题是:

  1. 两个功能之间有何区别?
  2. 当我运行上面的代码时,我得到了这个:
  3.   

    1 3 2 0 4 6 5 7 8 9 HERE MORE 1 0 3 2 5 4 6 7 8 9完成

    我希望pool.map按顺序返回输出,但它没有! 那么,为什么它没有按顺序返回?或者我误解了这个功能?

    1. 我认为调用pool.map时,主要(以下代码,如
      r = pool.map_async(f, range(10)); print 'HERE'; print 'MORE' 继续运行。所以我希望在数字之间打印“Here”和“More”,我的意思是
    2.   

      3 2 0 4 6 HERE 5 7 8 9 1 0 3 2更多5 4 6 7 8 9完成

      但它以其他方式发生。 为什么不像我期望的那样运行?

      1. 如果我评论重代码f函数现在只是:

        def f(x):   print x

      2. 然后两个函数将按顺序返回输出(我尝试运行很多次,它总是打印相同的结果。 那么,当它没有重代码时,为什么它的行为会有所不同。

        任何帮助将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:1)

from multiprocessing import Pool
import time

def f(x):
# I make a heavy code here to take time
  for i in range(10000):
     for i in range(10000):
        pass #do nothing
  print x
  return x 

if __name__ == '__main__':
  pool = Pool(processes=4)

  print pool.map(f, range(10))
  r  = pool.map_async(f, range(10))

  # DO STUFF
  print 'HERE'
  print 'MORE'
  r.wait()
  print 'Done'
  print r.get()
  1. pool.map_async不会阻止您的脚本,而pool.map会阻止(quikst3r提及)。
  2. 我稍微调整了你的脚本以便更具说明性。正如您所看到的那样,最终结果都是有序的,除了在启动pool.map_async后,执行后续代码。输出是:

    1
    3
    0
    2
    4
    5
    7
    6
    8
    9
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    HERE
    MORE
    3
    2
    1
    0
    5
    4
    6
    7
    8
    9
    Done
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
  3. 由于工作分配的开销和cpu的个别负载,很难确定打印订单。