multiprocessing.Pool.map_async() 的结果是不是以与输入相同的顺序返回?

Posted

技术标签:

【中文标题】multiprocessing.Pool.map_async() 的结果是不是以与输入相同的顺序返回?【英文标题】:Are results of multiprocessing.Pool.map_async() returned in the same order of the input?multiprocessing.Pool.map_async() 的结果是否以与输入相同的顺序返回? 【发布时间】:2020-01-03 15:28:35 【问题描述】:

阅读multiprocessing.Pool doc 我了解到map_asyncapply_asyncmapappy 的两个版本,它们应该更快,但不能保证输入的处理顺序与已提供。

但是,我不明白,在调用 multiprocessing.pool.AsyncResult.get() 时,结果是否“重新排序”以匹配输入顺序,还是按照处理顺序返回?

【问题讨论】:

根据经验,我知道结果是有序的,文档也建议这样做,但令人惊讶的是,这并没有明确提及。 明确提到imap_unordered 是(令人震惊的)有序的,因此除非另有说明,否则可能是假定有序的情况 【参考方案1】:

执行下面的测试,调用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)     

【讨论】:

【参考方案2】:

是的,return-order 将与 input-order 相同。唯一的区别是异步方法不会阻止父级中的MainThread,您必须明确地.get() 结果。 .map().map_async() 都在后台调用相同的低级方法 ._map_async()

请注意,处理顺序返回顺序是两个不同的东西。处理顺序不受chunking的保证和影响。

对于.apply_async(),您将获得您正在调用.get() 的特定AsyncResult 对象的结果。

【讨论】:

以上是关于multiprocessing.Pool.map_async() 的结果是不是以与输入相同的顺序返回?的主要内容,如果未能解决你的问题,请参考以下文章

multiprocessing.Pool:map_async 和 imap 有啥区别?

multiprocessing.Pool.map_async() 的结果是不是以与输入相同的顺序返回?

python multiprocessing pool.map() 等到方法完成

如何从multiprocessing.Pool.map的worker_funtion内部为数组赋值?

multiprocessing.Pool.map引发MemoryError

Python处理图片缩略图