[英]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 3 2 0 4 6 5 7 8 9 这里更多 1 0 3 2 5 4 6 7 8 9 完成
我希望pool.map
会按顺序返回输出,但它没有! 那么,为什么它没有按顺序返回? 或者我误解了这个功能?
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 完成
但它以另一种方式发生了。 为什么它不像我预期的那样运行?
如果我评论繁重的代码,现在的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()
pool.map_async
不会阻止您的脚本,而pool.map
会(如quikst3r 所述)。 我稍微调整了您的脚本以使其更具说明性。 如您所见,最终结果都是有序的,除了在启动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.