Python 多处理计算中map()模块和imap()之间的差异
我有一段带有多处理实现的代码:Python 多处理计算中map()模块和imap()之间的差异,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我有一段带有多处理实现的代码: 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 functi
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()
正确地显示了列表(res\p)
列表的长度,但是当我更改为imap()
时,列表是空的?您能使用map()
模块跟踪进度吗?tqdm
不能与map
一起工作,因为map
正在阻塞;它等待所有结果,然后将其作为列表返回。在执行循环时,唯一要做的是在该循环中发生的事情——并行阶段已经完成
imap
不会阻塞,因为它只返回一个迭代器,即您可以请求下一个结果、下一个结果和下一个结果。只有当你这样做,通过循环,下一个结果是等待,一个接一个。作为迭代器的结果意味着,一旦所有结果都被使用(循环结束),它将是空的。因此,在列表中没有什么可放的了。例如,如果希望保留结果,可以将每个结果追加到循环中,或者将代码更改为:
res_p = list(tqdm.tqdm(pool.imap(f, paramlist), total=len(paramlist)))
for res in res_p:
... # Do stuff
tqdm
不能与map
一起工作,因为map
被阻塞;它等待所有结果,然后将其作为列表返回。在执行循环时,唯一要做的是在该循环中发生的事情——并行阶段已经完成
imap
不会阻塞,因为它只返回一个迭代器,即您可以请求下一个结果、下一个结果和下一个结果。只有当你这样做,通过循环,下一个结果是等待,一个接一个。作为迭代器的结果意味着,一旦所有结果都被使用(循环结束),它将是空的。因此,在列表中没有什么可放的了。例如,如果希望保留结果,可以将每个结果追加到循环中,或者将代码更改为:
res_p = list(tqdm.tqdm(pool.imap(f, paramlist), total=len(paramlist)))
for res in res_p:
... # Do stuff
谢谢你的帮助和解释!:)谢谢你的帮助和解释!:)