multiprocessing.Pool.map_async() 的结果是否以与输入相同的顺序返回?
Are results of multiprocessing.Pool.map_async() returned in the same order of the input?
阅读 multiprocessing.Pool doc 我了解到 map_async
和 apply_async
是 map
和 appy
的两个版本,它们应该更快,但确实如此不保证输入的处理顺序与提供的顺序相同。
但是,我不明白,调用multiprocessing.pool.AsyncResult.get()
时,结果"reordered"是否符合输入的顺序,还是按照处理的顺序返回?
执行下面的测试似乎调用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)
是的,return-order 将与 input-order 相同。唯一的区别是异步方法不会阻止父级中的 MainThread
,您必须显式 .get()
结果。 .map()
和 .map_async()
都在后台调用相同的低级方法 ._map_async()
。
请注意,处理顺序和return-顺序是两个不同的东西。处理顺序不受 .
的保证和影响
对于 .apply_async()
,您将获得您正在调用 .get()
的特定 AsyncResult
-对象的结果。
阅读 multiprocessing.Pool doc 我了解到 map_async
和 apply_async
是 map
和 appy
的两个版本,它们应该更快,但确实如此不保证输入的处理顺序与提供的顺序相同。
但是,我不明白,调用multiprocessing.pool.AsyncResult.get()
时,结果"reordered"是否符合输入的顺序,还是按照处理的顺序返回?
执行下面的测试似乎调用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)
是的,return-order 将与 input-order 相同。唯一的区别是异步方法不会阻止父级中的 MainThread
,您必须显式 .get()
结果。 .map()
和 .map_async()
都在后台调用相同的低级方法 ._map_async()
。
请注意,处理顺序和return-顺序是两个不同的东西。处理顺序不受
对于 .apply_async()
,您将获得您正在调用 .get()
的特定 AsyncResult
-对象的结果。