2016-05-20 25 views
0

テキストファイルを入力として受け取り、何らかの処理を行い、結果をファイルに書き出す関数があります。私は複数のファイルにまたがってこれを並行して実行しようとしています。ファイルの処理順序は重要ではなく、それぞれの処理は完全に独立しています。ここで私は今持っているものです。Pythonで出力を書き込む並列関数の適切な処理

import mulitprocessing as mp 
import pandas as pd 
from glob import glob 

def processor(fi): 
    df = pd.read_table(fi) 
    ...do some processing to the df.... 

    filename = fi.split('/')[-1][:-4] 
    df.to_pickle('{}.pkl'.format(filename)) 

if __name__ == '__main__': 

    files = glob('/path/to/my/files/*.txt') 
    pool = mp.Pool(8) 

    for _ in pool.imap_unordered(processor, files): 
     pass 

、これは実際に私の知る限り、完全に正常に動作しますが、構文は本当にhinkyようで、それについて行くのより良い方法がある場合、私は思ったんだけど。例えば。明示的なループを実行しなくても同じ結果が得られますか?

私はmap_async(processor, files)を試しましたが、出力ファイルは生成されません(ただし、エラーは発生しません)。

提案?

+0

'print'文を追加して、' map_async'を試したときに実際に実行されていることを確認しましたか? –

答えて

2

を使用することができますが、asyncビットは「ジョブを設定した後ブロックしないですぐに戻る」ことを意味するため、終了するまで待つ必要があります。待っていなければ、コードの後ろに何もないと、プログラムは終了し、すべてのサブプロセスは即座に、完了する前に殺されます。あなたが望むものではありません!

次の例を助ける必要があります。

from multiprocessing.pool import Pool 
from time import sleep 

def my_func(val): 
    print('Executing %s' % val) 
    sleep(0.5) 
    print('Done %s' % val) 

pl = Pool() 
async_result = pl.map_async(my_func, [1, 2, 3, 4, 5]) 

res = async_result.get() 
print('Pool done: %s' % res) 

出力をその(私はそれを実行したとき)は、次のとおりです。また

Executing 2 
Executing 1 
Executing 3 
Executing 4 
Done 2 
Done 1 
Executing 5 
Done 4 
Done 3 
Done 5 
Pool done: [None, None, None, None, None] 

、平野mapを使用した場合も、トリックを行う、その後、あなたでしょうそれが「非同期」でなく、すべてのジョブが完了するのを同期的に待つので、それを待つ必要はありません。

pl = Pool() 
res = pl.map(my_func, [1, 2, 3, 4, 5]) 
print('Pool done: %s' % res) 
+0

便利な例で素晴らしい答え。しかし、1つの明確化:あなたが記述する2つのアプローチの間にパフォーマンスの差があると思いますか?なぜ、なぜそうではないのですか? – moustachio

+1

私は違いを期待しません。私の最初の例と同じように 'map()'は 'map_async()'を呼び出して結果を待っていると思いますが、コードをチェックしていません。 [編集しましたので、私はshift-enterの代わりにenterを入力してください] マルチプロセッシングを使用している場合は、スピンオフしている各機能で多くの作業を行う必要があるため、オーバーヘッド'map'と' async_map + get'の違いは無視してください。そうでない場合は、マルチプロセッシングを使用する必要はありません。 – daphtdazz

+0

よかった、ありがとう!そして、はい、その作品は確かに無視できないものです。私はベストプラクティスを学ぼうとしています。 – moustachio

関連する問題