多进程:map与map_async的区别

81

使用mapmap_async的区别是什么?它们不是将列表中的项分发给4个进程后运行相同的函数吗?

那么认为两者都是异步并行运行是错误的吗?

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)

5
map 是同步的,只有在映射完成后才会返回结果;而 map_async 是异步的,会立即返回并允许在后台进行映射。两者都支持并行处理。 - Joachim Isaksson
1个回答

123

有四种将作业映射到进程的选择。您必须考虑多参数、并发、阻塞和排序。mapmap_async 只是在阻塞方面不同。map_async 是非阻塞的,而 map 是阻塞的。

假设您有一个函数

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'

示例输出:

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 = pool.map_async(f, range(10))会异步执行它们,并且只会在调用r.wait()时阻塞,因此我们会在HEREMORE之间看到输出,但DONE始终在末尾。


3
如果除了对列表执行函数f之外,我没有其他任务要做,那么map和map_async是相同的。 - aman
16
不完全正确。您会注意到map函数按顺序执行,但map_async不会。 - quikst3r
2
r.wait() 后面应该加上 print 'DONE' 吗? - HBeel
1
如果上面的示例在第一次运行时mapmap_async没有返回不同的结果,请尝试设置range(500)或其他大的值。 - webelo
5
@Catbuilts 没错,map_asyncmap 的调用顺序没有区别。当@quikst3r说有区别时是错误的。map 实际上在内部实现中等同于 map_async(...).get() - dano
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接