多进程列表中的多个文件
Posted
技术标签:
【中文标题】多进程列表中的多个文件【英文标题】:Multiprocess multiple files in a list 【发布时间】:2014-07-10 17:54:24 【问题描述】:我正在尝试读取包含 N 个同步存储在列表中的 .csv 文件的列表。
现在我执行以下操作:
导入多进程
-
空列表
使用 .csv 的 listdir 附加列表
def A() -- 偶数文件 (list[::2])
def B() -- 奇数文件(list[1::2]
进程 1 def A()
进程 2 def B()
def read_all_lead_files(folder):
for files in glob.glob(folder+"*.csv"):
file_list.append(files)
def read_even():
file_list[::2]
def read_odd():
file_list[1::2]
p1 = Process(target=read_even)
p1.start()
p2 = Process(target=read_odd)
p2.start()
有没有更快的方法将列表的分区拆分为 Process 函数?
【问题讨论】:
你是说你对“偶数”和“奇数”文件进行不同的处理(无论那是什么意思)? “更快”?凭什么?这两个功能实际上在某些方面不同吗?如果对这两个功能的作用以及您要改进的功能至少有一点了解,我看不出我们可以如何帮助您。发布一些最小的代码。 将列表实际拆分为偶数和奇数非常快。但是每个其他文件上的 A() / B() 似乎非常随意。你为什么这样做? 发布到服务器。治理只允许每个 POST 有一定数量的连接。多个 POSTS 解决了这个问题。 我问是因为我猜你想要一个池并且并不真的需要偶数/奇数 A/B。看来我是对的。 【参考方案1】:我猜是应您的要求,因为最初的问题还不清楚。由于os.listdir
不保证顺序,我假设您的“两个”功能实际上是相同的,您只需要同时对多个文件执行相同的过程。
根据我的经验,最简单的方法是启动Pool
,为每个文件启动一个进程,然后等待。例如
import multiprocessing
def process(file):
pass # do stuff to a file
p = multiprocessing.Pool()
for f in glob.glob(folder+"*.csv"):
# launch a process for each file (ish).
# The result will be approximately one process per CPU core available.
p.apply_async(process, [f])
p.close()
p.join() # Wait for all child processes to close.
【讨论】:
glob 返回一个列表。您可以将 for 循环替换为p.apply_async(process, glob(folder+"*.csv"))
@tdelaney 我想你的意思是p.map_async
,在这种情况下是的,这是真的。我选择用一个显式循环来拼写它,因为这样更容易看到发生了什么。
@HenryKeiter - 你是对的! got may 映射并向后应用。
谢谢,这对我的照片转换实用程序非常有用。以上是关于多进程列表中的多个文件的主要内容,如果未能解决你的问题,请参考以下文章