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 的多处理花费的时间最少。
我正在 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 倍。
现在我的处理图是这样的。