【发布时间】:2014-12-25 12:20:17
【问题描述】:
我有一个文件夹名称字典,我想并行处理。在每个文件夹下,有一个我想在 series 中处理的文件名数组:
folder_file_dict = {
folder_name : {
file_names_key : [file_names_array]
}
}
最终,我将创建一个名为 folder_name 的文件夹,其中包含名称为 len(folder_file_dict[folder_name][file_names_key]) 的文件。我有这样的方法:
def process_files_in_series(file_names_array, udp_port):
for file_name in file_names_array:
time_consuming_method(file_name, udp_port)
# create "file_name"
udp_ports = [123, 456, 789]
请注意上面的time_consuming_method(),由于通过 UDP 端口调用需要很长时间。我也仅限于使用上面数组中的 UDP 端口。因此,我必须等待 time_consuming_method 在 UDP 端口上完成,然后才能再次使用该 UDP 端口。这意味着我一次只能运行len(udp_ports) 线程。
因此,我最终将创建len(folder_file_dict.keys()) 线程,并通过len(folder_file_dict.keys()) 调用process_files_in_series。我也有一个 MAX_THREAD 计数。我正在尝试使用Queue 和Threading 模块,但我不确定我需要什么样的设计。我如何使用队列和线程以及可能的条件来做到这一点?使用线程池的解决方案也可能会有所帮助。
注意
我并不是想提高读/写速度。我正在尝试并行化对process_files_in_series 下的time_consuming_method 的调用。创建这些文件只是过程的一部分,而不是速率限制步骤。
另外,我正在寻找使用Queue、Threading 和可能的Condition 模块或与这些模块相关的任何内容的解决方案。线程池解决方案也可能会有所帮助。我不能使用进程,只能使用线程。
我也在寻找 Python 2.7 中的解决方案。
【问题讨论】:
-
最简单的解决方案(代码方面)是使用线程池,例如
multiprocessing.dummy.Pool.map(),这里是code example。为什么要并行处理文件?如果所有文件名都在同一个物理磁盘上;并行处理可能不会提高时间性能(可能相反)。另一方面,如果进程受 CPU 限制,那么您应该使用进程而不是线程(如果process_files_in_series()不释放 GIL)。 -
在
process_files_in_series方法中处理每个文件需要很长时间。因此,我试图通过为每个文件夹并行调用一次来并行化process_files_in_series上的调用。 -
如果您的磁盘只能以 100MB/s 的速度读/写,那么如果您的代码已经以 100MB/s 的速度读/写,那么再多的线程也不会让您的代码更快。
-
我的帖子在上面更正了。我的写入速度没有接近最大值,因为我需要在
process_files_in_series内执行一个很长的方法。抱歉,如果它具有误导性,但我并不想提高我的读/写速度。 -
如果只有一个内核,那么并行运行受 CPU 限制的代码(计算)可能不会运行得更快。线程和进程都无济于事。
标签: python multithreading python-2.7 parallel-processing