我有这样的程序:
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 HERE MORE 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'
继续运行。所以我希望在数字之间打印“Here”和“More”,我的意思是3 2 0 4 6 HERE 5 7 8 9 1 0 3 2更多5 4 6 7 8 9完成
但它以其他方式发生。 为什么不像我期望的那样运行?
如果我评论重代码,f
函数现在只是:
def f(x):
print x
然后两个函数将按顺序返回输出(我尝试运行很多次,它总是打印相同的结果。 那么,当它没有重代码时,为什么它的行为会有所不同。
任何帮助将不胜感激。 谢谢。
答案 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()
pool.map_async
不会阻止您的脚本,而pool.map
会阻止(quikst3r提及)。我稍微调整了你的脚本以便更具说明性。正如您所看到的那样,最终结果都是有序的,除了在启动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的个别负载,很难确定打印订单。