繁体   English   中英

Pool.map 与 Pool.map_async

[英]Pool.map vs Pool.map_async

我有这样的程序:

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个功能有什么区别?
  2. 当我运行上面的代码时,我得到了这个:

1 3 2 0 4 6 5 7 8 9 这里更多 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'继续运行。 所以我希望在数字之间打印“这里”和“更多”,我的意思是像

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

但它以另一种方式发生了。 为什么它不像我预期的那样运行?

  1. 如果我评论繁重的代码,现在的f函数就是:

    def f(x): print x

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

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

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之后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]

而由于作业分配的开销和 CPU 的单独负载,很难确定打印顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM