2016-10-01 7 views
0

私はマルチプロセッシングパッケージが本当に新しいので、タスクを完了できません。Python - 単一の結果ファイルに書き込む際のマルチプロセッシング

私は多くの計算をオブジェクトのリストで行います。

私が書き留める必要がある結果は、それらのオブジェクトにも保存されます。

結果は、プロセスが計算を完了するとすぐに1つのファイルに書き込まれます(私が少なくともそれを得た方法は、すべての計算が完了するまで待つ)。

import multiprocessing 
import time 
import csv 

class simpl(): 
    def __init__(self, name, val): 
     self.name = name 
     self.val = val 

def pot_val(inpt): 
    print("Process %s\t ..." % (inpt.name)) 
    old_v = inpt.val 
    inpt.val *= inpt.val 
    if old_v != 8: 
      time.sleep(old_v) 
    print("Process %s\t ... Done" % (inpt.name)) 


def mp_worker(inpt): 
    pot_val(inpt) 
    return inpt 

def mp_handler(data_list): 
    p = multiprocessing.Pool(4) 
    with open('results.csv', 'a') as f: 
     res = p.map_async(mp_worker, data_list) 
     results = (res.get()) 
     for result in results: 
      print("Writing result for ",result.name) 
      writer= csv.writer(f, lineterminator = '\n', delimiter=";") 
      writer.writerow((result.name, result.val)) 
if __name__=='__main__': 
    data = [] 
    counter=0 
    for i in range(10): 
     data.append(simpl("name"+str(counter),counter)) 
     counter += 1  

    for d in data: 
     print(d.name, d.val) 
    mp_handler(data) 

すべてのプロセスが完了するのを待つことなく、計算結果を1つのファイルに同時に書き込む方法を教えてください。

+0

行うのPython 3.3+でimap_unordered

def mp_handler(data_list): p = multiprocessing.Pool(4) with open('results.csv', 'a') as f: writer= csv.writer(f, lineterminator = '\n', delimiter=";") for result in p.imap_unordered(mp_worker, data_list): print("Writing result for ",result.name) writer.writerow((result.name, result.val)) 

を使用することができます。何か質問がありますか? –

+0

申し訳ありませんが、私はそれを質問に変更しました:) – Ali

+0

結果の順序は関係しますか? – janbrohl

答えて

3

方が良い。これはかなり話です

def mp_handler(data_list): 
    with multiprocessing.Pool(4) as p: 
     with open('results.csv', 'a') as f: 
      writer= csv.writer(f, lineterminator = '\n', delimiter=";") 
      for result in p.imap_unordered(mp_worker, data_list): 
       print("Writing result for ",result.name) 
       writer.writerow((result.name, result.val)) 
+0

ちょうどsidenote質問:私はどのようにこの構造のKeyboardInterrupt例外をキャッチするでしょうか?私はtryをラップしようとしました:except: 'with open ..'しかし、それでもワーカーの例外はすべて出力されます。 – Ali

+0

申し訳ありませんが、あなたが試した明白な解決策は別として、分かりません。予期せぬ挙動が複数のプロセスを引き起こす原因であるかどうかを知るための良い戦略は、スレッドを使用する 'multiprocessing.dummy'で' multiprocessing'を置き換えることです。時には(特にWindows上では) 'multiprocessing.dummy'でパフォーマンスが向上します – janbrohl

関連する問題