並行

2015-11-07 23 views
0

搜索文件,我想作出這樣的搜索,並行命令,對於給定字,給定數量的文件在哪裏?並行

ppatternsearch [-p n] word {files} 
  1. ppatternsearch是命令名稱
  2. -p是定義並行
  3. n的水平的選擇是-p選項將 創建的字搜索的進程/線程的數目

  4. word是我會尋找

  5. 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

下一步是將其導入threadingmultiprocessing並推出pattern_finder的適當次數。

你可能也想看看queue.Queue所以你的結果不打印混亂。

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()))