假设我有一个代码,使用多重处理返回了200000个项目列表,这些项目是它们自己的列表(在标记为点1的代码中)。如果我只需要一个包含内部项目的列表,我将再次迭代收到的列表(在标记为第2点的代码中)。

问题:标记为点2的线不能并行工作,因此需要花费大量时间。有没有办法将所有数据直接从功能cu写入doc?

def cu(num):
   return range(num)

pool = mp.Pool(processes=384)
results = [pool.apply_async(cu, args=(20, )) for ind in range(200000)]
docs = [p.get() for p in results] # point 1
docs = [point for item in docs for point in item] # point 2
pool.close()
pool.join()


我怀疑用多处理代替多线程可以解决此问题,但恐怕它不会节省时间。

注意:这是一个最小的示例。

最佳答案

问题在于,您只为一个操作运行一个池,但是运行了200k次,但是您希望该池运行超过200k个操作。您需要将map_async与生成器和itertools.chain.from_iterable结合使用:

docs = itertools.chain.from_iterable(
    pool.map_async(cu, args=(20 for _ in range(200000)))
)


这个解决方案是懒惰的,这意味着您需要消耗迭代器来获取值(在其上迭代),可以轻松使用:

docs = list(docs)


或者,如果您不希望存储结果:

for doc in docs:
    ... #Do your stuff here

10-05 19:56