2017-07-11 11 views
0

ディレクトリツリーを介したマルチプロセッシングが期待どおりに動作しません。私はすべてisoファイルを単一のset()に追加しようとしており、そのセットだけを出力します。私はNoneを返すようにPythonに指示していることを知っていますが、他に返すことなしにこれを行う方法がわかりませんNone。マルチプロセッシングから特異セットを出力するにはどうすればよいですか?今のようファイルツリーを介したマルチプロセッシングで期待される出力が出力されない

import itertools 
import multiprocessing 


def worker(filename): 
    data_set = set() 
    if ".iso" in filename: 
     data_set.add(filename) 
    return data_set if len(data_set) != 0 else None 


def search_for_iso(dirname=None, verbose=False, default_path="/"): 
    iso_found = set() 
    if dirname is None: 
     pool = multiprocessing.Pool(processes=48) 
     walker = os.walk(default_path) 
     file_data_gen = itertools.chain.from_iterable((
      os.path.join(root, f) for f in files) for root, sub, files in walker) 
     results = pool.map(worker, file_data_gen) 
     return results 

それが出力されます以下:set(['/test.iso', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, .....]) # whole lot of None's

予想される出力:set(['/test.iso'])

答えて

0

私は、処理の結果を走ると、ファイルが終了した場合にチェックすることで、このための解決策を考え出しました.isoで:

def worker(filename): 
    if filename.endswith(".iso"): 
     return filename 


def search_for_iso(dirname=None, verbose=False, default_path="/"): 
    retval = set() 
    if dirname is None: 
     pool = multiprocessing.Pool(processes=48) 
     walker = os.walk(default_path) 
     file_data_gen = itertools.chain.from_iterable((
      os.path.join(root, f) for f in files) for root, sub, files in walker) 
     results = pool.map(worker, file_data_gen) 
     for data in results: 
      if data is not None: 
       retval.add(data) 
     return retval 

これがうまく動作するようだとPROCを遅くしていないようです全部

0

まず、CPUよりもはるかに遅いファイルシステムを待たなければならないため、まず複数のプロセスを使用してパフォーマンスを向上させることはできません。あなたの現在のコードについては

、ちょうどそれが

def worker(filename): 
    data_set = set() 
    if ".iso" in filename: 
     data_set.add(filename) 
    return data_set 
空の場合でも、セットを返します
関連する問題