我有一段带有多处理实现的代码:
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()
模块跟踪进度吗?
答案 0 :(得分:1)
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