Python 中的多处理与线程

Multiprocessing vs Threading in Python

我正在 python 学习多处理和线程处理和创建大量文件,图表显示在这里 diagram

每个输出文件都依赖于对所有输入文件的分析。

程序单次处理时间比较长,尝试了以下代码:

(a) 多处理

start = time.time()
process_count = cpu_count()
p = Pool(process_count)
for i in range(process_count):
    p.apply_async(my_read_process_and_write_func, args=(i,w))

p.close()
p.join()
end = time.time()

(b) 线程

start = time.time()
thread_count = cpu_count()
thread_list = [] 

for i in range(0, thread_count):
    t = threading.Thread(target=my_read_process_and_write_func, args=(i,))
    thread_list.append(t)

for t in thread_list:
    t.start()

for t in thread_list:
    t.join()

end = time.time()

我在一台 Windows 8 核 PC 上使用 Python 3.6 运行这些代码。但是,Multiprocessing 方法所用时间与单处理方法大致相同,Threading 方法所用时间约为单处理方法的 75%。

我的问题是:

我的代码正确吗?

有没有更好的way/codes提高效率? 谢谢!

您的处理是 I/O 绑定的,而不是 CPU 绑定的。因此,您拥有多个进程这一事实帮助不大。多处理中的每个 Python 进程都卡在等待输入或输出,而 CPU 什么都不做。增加多处理中的池大小应该会提高性能。

跟随 Tarik 的回答,因为我的处理是 I/O 绑定的,所以我制作了输入文件的多个副本,然后每个处理读取并处理这些文件的不同副本。 现在我的代码 运行 快了 8 倍。

现在我的处理图是这样的。 我的输入文件包括一个索引文件(大约400MB)和100个其他文件(每个大小=330MB,可以认为是一个文件池)。 为了生成一个输出文件,需要读取索引文件和文件池中的所有文件。 (例如索引文件的第一行是15,那么需要读取文件池中每个文件的第15行以生成输出文件1。) 以前我试过 multiprocessing 和 Threading 没有复制,代码很慢。然后我通过为每个处理只复制索引文件来优化代码,因此每个处理单独读取索引文件的副本,然后读取文件池以生成输出文件。 目前,使用 8 cpu 个内核,poolsize=8 的多处理花费的时间最少。