并行搜索文件

时间:2015-11-07 11:37:35

标签: python multithreading python-2.7 python-3.x subprocess

我想创建一个命令,并行搜索给定单词的给定数量的文件,其中......

ppatternsearch [-p n] word {files}
  1. ppatternsearch是命令名称
  2. -p是定义并行化级别的选项
  3. n是-p选项将要处理的进程/线程数 创建单词搜索

  4. word是我要搜索的字词

  5. files,正如您可以想象的那样,我将要搜索的文件。
  6. 我希望以两种方式执行此操作 - 一个使用processes,另一个使用threads。最后,父进程/主线程返回找到正在搜索的单词的行数。

    事情是,我已经开发了一些代码而且我已经碰壁了。我不知道从哪里开始。

    import argparse, os, sys, time
    
    num_lines_with_pattern = []
    
    def pattern_finder(pattern, file_searched):
        counter = 0
        with open(file_searched, 'r') as ficheiro_being_read:
            for line in ficheiro_being_read:
                if pattern in line:
                    print line
                    counter += 1
        num_lines_with_pattern.append(counter)
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', type = int, default = 1, help = Defines command parallelization.')
    args = parser.parse_args()
    

2 个答案:

答案 0 :(得分:0)

下一步是导入threadingmultiprocessing并启动pattern_finder适当的次数。

您可能还想查看queue.Queue,因此您的结果不会被混淆。

答案 1 :(得分:0)

问题可能是I / O绑定,因此引入多个线程/进程不会使您的硬盘更快地工作。

虽然应该很容易检查。要使用进程池运行pattern_finder()

#!/usr/bin/env python
from functools import partial
from multiprocessing import Pool, cpu_count

def pattern_finder(pattern, file_searched):
    ...
    return file_searched, number_of_lines_with_pattern

if __name__ == "__main__":
    pool = Pool(n or cpu_count() + 1) 
    search = partial(pattern_finder, word)
    for filename, count in pool.imap_unordered(search, files):
        print("Found {count} lines in {filename}".format(**vars()))