multiprocessing: map vs map_async
使用map和map_async有什么区别?在将项目从列表分发到4个进程后,它们是否不运行相同的函数?
那么假设两者都运行异步和并行是错误的吗?
1 2 3 4 5 6 7 8
| def f(x):
return 2*x
p=Pool(4)
l=[1,2,3,4]
out1=p.map(f,l)
#vs
out2=p.map_async(f,l) |
- map是否只在映射完成后返回(即同步但并行),而map_async是否立即返回并允许在后台进行映射(即异步和并行)?
将作业映射到流程有四种选择。您必须考虑多参数、并发性、阻塞和排序。map和map_asnyc只在阻塞方面有所不同。map_async是非阻塞的,因为map是阻塞的。
所以假设你有一个功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from multiprocessing import Pool
import time
def f(x):
print x*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' |
示例输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 0
1
9
4
16
25
36
49
64
81
0
HERE
1
4
MORE
16
25
36
9
49
64
81
DONE |
号
pool.map(f, range(10))将等待所有10个函数调用完成,以便我们连续看到所有的打印。当调用r.wait()时,r = pool.map_async(f, range(10))将异步执行它们,并且只阻塞它们,因此我们看到HERE和MORE之间,但DONE始终在末尾。
- 好的,如果除了在列表上执行函数f之外,我没有其他任务要做,那么map和map_async是相同的。
- 不完全是。您会注意到map将按顺序执行,但map-async不会
- 在r.wait()之后应该有print 'DONE'吗?
- 是的,应该有的!
- 如果上述示例在第一次运行时没有返回map和map_async的不同结果,请尝试设置range(500)或较大的值。
- stackoverflow.com/questions/35708371/…
- 您好,此解决方案是否适用:stackoverflow.com/questions/5442910/…?我正试图向函数传递多个参数。
- @对我来说,它们都是随机执行的。我将func f()改为print(x),参数为:"pool.map(f,range(11,20));r=pool.map_async(f,range(10))";运行代码后,返回:"11 12 13 15 16 17 18 14 19 here 0 more 2 1 3 4 5 6 7 8 9 done"