阅读multiprocessing.Pool 文档,我理解map_async
andapply_async
是 and 的两个版本,map
应该appy
更快,但这不能保证输入的处理顺序与提供的顺序相同。
但是,我不明白在调用时multiprocessing.pool.AsyncResult.get()
结果是否“重新排序”以匹配输入顺序,或者它们是否按照处理顺序返回?
阅读multiprocessing.Pool 文档,我理解map_async
andapply_async
是 and 的两个版本,map
应该appy
更快,但这不能保证输入的处理顺序与提供的顺序相同。
但是,我不明白在调用时multiprocessing.pool.AsyncResult.get()
结果是否“重新排序”以匹配输入顺序,或者它们是否按照处理顺序返回?
是的,return-order 将与 input-order 相同。唯一的区别是异步方法不会阻止MainThread
父级中的 ,您必须.get()
明确获得结果。.map()
并且.map_async()
两者都在后台调用相同的低级方法._map_async()
。
请注意,处理顺序和退货顺序是两个不同的东西。处理顺序不受分块的保证和影响。
因为.apply_async()
您将获得AsyncResult
您所调用.get()
的特定对象的结果。
执行下面的测试似乎在调用时恢复了顺序get()
。然而,正如右腿所说,我在文档中找不到任何提及。因此,在没有事实证明而不是测试证明之前,我不会接受这个答案
import multiprocessing as mp
from time import sleep
def func(i):
if i == 1:
sleep(3)
return i**2
if __name__=='__main__':
with mp.Pool(mp.cpu_count()) as pool:
res = pool.map_async(func, range(10)).get()
print(res)