多进程列表中的多个文件

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 映射并向后应用。 谢谢,这对我的照片转换实用程序非常有用。

以上是关于多进程列表中的多个文件的主要内容,如果未能解决你的问题,请参考以下文章

多进程比较多个 .txt 文件中的字符串?

多进程 multiprocessing 之 Pool

多线程,异步

Python多进程,多线程和异步实例

Python多进程,多线程和异步实例

python多进程操作-进程池