Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理计算中map()模块和imap()之间的差异_Python_Python 3.x_Multiprocessing - Fatal编程技术网

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

谢谢你的帮助和解释!:)谢谢你的帮助和解释!:)