首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pool.map对Pool.map_async

Pool.map对Pool.map_async
EN

Stack Overflow用户
提问于 2016-10-04 02:21:46
回答 1查看 6.4K关注 0票数 2

我有这样的程序:

代码语言:javascript
复制
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则不会。我试着找出他们之间的区别,但我还没有搞清楚。

实际上,我读过一些文章,例如:async

但我还是很困惑。我的问题是:

  1. 这两个函数之间有什么区别?
  2. 当我运行上面的代码时,我得到了以下信息:

1 3 2 0 4 6 5 7 8 9在此多1 0 3 2 5 4 6 7 8

我希望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

但事情发生在另外一种方式。为什么它不像我预期的那样运行呢?

  1. 如果我注释沉重的代码,现在的f函数是: def f(x): print x

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

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

EN

回答 1

Stack Overflow用户

发布于 2017-02-13 01:01:15

代码语言:javascript
复制
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 8 9 0,1,2,3,4,5,6,7,8,8,9在此多3 2 1 0 5 6 7 8 9作0、1、2、3、4、5、6、7、8、9

然而,由于您的cpus的作业分配和单个负载中的开销,很难确定打印顺序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39843216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档