我有这样的程序:
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 3 2 0 4 6 5 7 8 9在此多1 0 3 2 5 4 6 7 8
我希望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
但事情发生在另外一种方式。为什么它不像我预期的那样运行呢?
f函数是:
def f(x): print x然后,这两个函数都会按顺序返回输出(我多次尝试运行,它总是打印相同的结果。那么,为什么当它有/不存在大量代码时,它的行为会有所不同。
任何帮助都将不胜感激。谢谢。
发布于 2017-02-13 01:01:15
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 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的作业分配和单个负载中的开销,很难确定打印顺序。
https://stackoverflow.com/questions/39843216
复制相似问题