阅读multiprocessing.Pool doc我知道map_async
和apply_async
是map
和appy
的两个版本,应该更快,但不能保证输入的处理顺序与提供的顺序相同。
但是,我不知道在调用multiprocessing.pool.AsyncResult.get()
时是否对结果进行“重新排序”以匹配输入顺序,还是按处理的顺序返回结果?
答案 0 :(得分:1)
是的,退货顺序将与输入顺序相同。唯一的区别是异步方法不会阻塞父级中的MainThread
,而您将必须显式地.get()
。 .map()
和.map_async()
都在后台调用相同的低级方法._map_async()
。
请注意,处理顺序和退货顺序是两回事。 chunking无法保证并影响处理顺序。
对于.apply_async()
,您将得到要调用其AsyncResult
的特定.get()
对象的结果。
答案 1 :(得分:0)
执行下面的测试,似乎在调用get()
时恢复了顺序。正如Right Leg所说,我在文档中找不到任何提及。因此,我不会接受这个答案,除非事实而不是测试证明了这一点
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)