使用map
和map_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)
使用map
和map_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)
有四种将作业映射到进程的选择。您必须考虑多参数、并发、阻塞和排序。map
和 map_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()
时阻塞,因此我们会在HERE
和MORE
之间看到输出,但DONE
始终在末尾。map
函数按顺序执行,但map_async
不会。 - quikst3rr.wait()
后面应该加上 print 'DONE'
吗? - HBeelmap
和map_async
没有返回不同的结果,请尝试设置range(500)
或其他大的值。 - webelomap_async
和 map
的调用顺序没有区别。当@quikst3r说有区别时是错误的。map
实际上在内部实现中等同于 map_async(...).get()
。 - dano
map
是同步的,只有在映射完成后才会返回结果;而map_async
是异步的,会立即返回并允许在后台进行映射。两者都支持并行处理。 - Joachim Isaksson