多处理计算中map()模块和imap()之间的差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多处理计算中map()模块和imap()之间的差异相关的知识,希望对你有一定的参考价值。

我有一段代码与多处理实现:

q = range(len(aaa))
w = range(len(aab))
e = range(len(aba))

paramlist = list(itertools.product(q,w,e))     

def f(combinations):
     q = combinations[0]
     w = combinations[1]
     e = combinations[2]    
# the rest of the function

if __name__ == '__main__':

     pool = mul.Pool(4)
     res_p = pool.map(f, paramlist)

     for _ in tqdm.tqdm(res_p, total=len(paramlist)):
           pass

     pool.close()
     pool.join()

其中'aaa,aab,aba'是具有三重值类型的列表:

aaa = [[1,2,3], [3,5,1], ...], etc.

我想使用imap()能够使用模块tqdm()来跟踪计算进度。但是为什么map()正确地向我展示了list(res_p)列表的长度,但是当我改为imap()时,列表是空的?你能用map()模块跟踪进度吗?

答案

tqdm不与map合作,因为map阻止;它等待所有结果,然后将它们作为list返回。当你的循环执行时,唯一的进展是在该循环中发生的事情 - 并行阶段已经完成。

imap不会阻塞,因为它只返回一个迭代器,即你可以要求下一个结果,下一个结果和下一个结果。只有当你这样做时,通过循环它,接下来的结果是等待的。它作为迭代器的结果意味着一旦所有结果都被消耗(循环结束),它就是空的。因此,没有什么可以留在list。如果您希望保留结果,可以将每个结果附加到循环中,例如,或者将代码更改为:

res_p = list(tqdm.tqdm(pool.imap(f, paramlist), total=len(paramlist)))

for res in res_p:
    ... # Do stuff

以上是关于多处理计算中map()模块和imap()之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 map / imap / imap_unordered 与不带参数的函数一起使用吗?

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

#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现目标跟踪

python difflib模块实现两个文件差异对比,并输出html格式。

Python:pool.map 和 map 之间的语义差异?

Python多处理imap - 丢弃超时进程