结果安排在多线程过程中

时间:2018-11-26 12:01:26

标签: python multithreading python-2.7 multiprocessing

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

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

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()

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

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

1 个答案:

答案 0 :(得分:0)

问题是您正在运行一个池,但只能进行一次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