【问题标题】:Results arranging in multithreading processes在多线程进程中安排结果
【发布时间】:2018-11-26 12:01:25
【问题描述】:

假设我有一个代码,使用多处理返回给我一个包含 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()

我怀疑用多处理代替多线程会解决这个问题,但我担心它不会节省时间。

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

【问题讨论】:

  • 顺便说一句,我不建议使用384 进程,只是你的计算机拥有的 CPU 内核数(但也许你在超级服务器上运行它)

标签: python multithreading python-2.7 multiprocessing


【解决方案1】:

问题是您只为一个操作运行了一个池,但运行了 20 万次,但您希望该池运行超过 20 万次操作。您需要使用 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

【讨论】:

  • 我附上了一个不代表完整问题的最小示例。假设计算更复杂且无法修改,您是否有解决方案?
  • 嗯,问题是您的方法不正确。如果你不能改变,那么这里没有什么可以解决的。这是懒惰地做它并从池计算中获取结果的方法。
  • 我正在处理提供输出列表的文件。 “这是懒惰地做它并从池计算中获得结果”是什么意思?
  • @GideonKogan,好的,我明白问题出在哪里。检查即将进行的编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多