【问题标题】:Multi-threading / Parallel Processing多线程/并行处理
【发布时间】:2017-01-19 22:47:28
【问题描述】:

我需要将数百个输入文件传递给函数以计算一些数字,并将它们写入输出文件。该函数不返回任何值。所以,每个函数调用都是独立的。

我没有串行调用函数,而是尝试了多处理,性能(执行时间)也好不了多少。任何关于提高性能的建议都是有价值的。甚至多处理是解决这个问题的方法吗?

import multiprocessing as mp
NumProcess = 4

def Analysis(InputFile):
    #do some calcs
    #Write results to output file
    #return nothing

FileList = ['InputFile1.csv','InputFile2.csv','InputFile3.csv',....]
pool = mp.Pool(processes=NumProcess)
temp = [pool.apply_async(Analysis, args=(File) for File in FileList]
output = [p.get() for p in temp]
pool.close()

【问题讨论】:

  • 是的 - 多处理是正确、最简单的方法。也许您的瓶颈在其他地方。如果您至少有两个 cpu 核心,这应该会更好。
  • 此列表中有太多左括号
  • 您的算法是否受 CPU 限制或 I/O 限制?如果它是受 I/O 限制的,那么生成多个线程/进程不会使其更快,并且如果它导致硬盘驱动器的磁头必须来回寻找比单次更多的来回搜索,则可能会使其更慢 -线程/单进程案例。

标签: python multithreading


【解决方案1】:

mutiprocssing 调用是否有效?此行有一个错误 - 因为您根本没有将 File 参数作为元组传递。

更正版本(注意尾随逗号以确保 args 是一个元组):

temp = [pool.apply_async(Analysis, args=(File,)) for File in FileList]

【讨论】:

  • 是的,它有效。抱歉,我在编辑帖子时错过了结尾的逗号和括号。由于函数调用是独立的,我认为应该有一种更有效的方法来并行处理文件。
  • 有一种更简单的方法——但效率并不高。在 Python 3 中,你可以使用 concurrent.futures.ProcessPoolExecutor - 但如果这不能加快你的速度,那么 conucurrent.futures 也不会。
  • 您对如何循环所有输入文件以让每个可用处理器并行运行其中一个输入文件有什么建议吗?例如 - Processor1 - Analysis(InputFile1); Processor2 - 分析(InputFile2),....
  • 是否因为 [pool.apply_async(Analysis, args=(File) for File in FileList] 而不是一次跨多个处理器执行 1 个文件?
  • 否 - 那么使用 ths 方法创建池的目的是什么? docs.python.org/3/library/…
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多