我想创建一个命令,并行搜索给定单词的给定数量的文件,其中......
ppatternsearch [-p n] word {files}
ppatternsearch
是命令名称-p
是定义并行化级别的选项 n
是-p选项将要处理的进程/线程数
创建单词搜索
word
是我要搜索的字词
files
,正如您可以想象的那样,我将要搜索的文件。我希望以两种方式执行此操作 - 一个使用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()
答案 0 :(得分:0)
下一步是导入threading
或multiprocessing
并启动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()))