无法迭代multiprocessing.pool.IMapIterator对象

时间:2019-07-23 04:47:30

标签: python python-3.x list iterator multiprocessing

不确定是否相关,但是我将Spyder(版本3.3.3)用作Python IDE,而此python版本是3.7.3

以下是我的代码:

import os
import numpy as np
import multiprocessing as mp

from itertools import product

def func1(a_tup):
    return (a_tup[0][0], *a_tup[1]), (a_tup[0][1]+a_tup[1][0])*a_tup[1][1]

if __name__ == '__main__':

    lst1 = np.arange(4)
    lst2 = np.arange(2, 8, 3)
    lst3 = product(enumerate(lst2),
                      (item for item in product(lst1, lst1) if item[0] < item[1])
                      )

    result1 = np.zeros((len(lst2), len(lst1) -1, len(lst1)), dtype = np.float32)

    with mp.Pool(os.cpu_count() - 1) as pool:
        mp_result1 = pool.imap(func1, lst3)#<--this line right here

    for item in mp_result1:
        print(item)

问题在于,一旦我运行此代码,它就会坐在那儿,永远不会完成。

我发现,只要将行mp_result1 = pool.imap(func1, lst3)更改为mp_result1 = list(pool.imap(func1, lst3)),编码就可以完美运行。但问题是,我正在寻找一种无需将mp_result1转换为列表就可以使代码工作的方法,因为当生成器mp_result1就内存使用而言足够大时,会将其转换为列表对象将立即消耗所有可用内存,从而使系统冻结。因此,绝对不是理想的情况。


这是我的问题:

如何遍历pool.imap的结果而不先将其转换为列表对象?

提前谢谢

0 个答案:

没有答案