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"