2017-03-28 17 views
1

複数のファイルを同時に変換するスクリプトを実行しましたが、いくつかのプロセスで4つのファイルを変換する代わりに、コードは複数のプロセスでファイルを1つずつ変換します。複数のファイルを扱うPythonのマルチプロセッシング

def convert (directoryName): 
    for path, dirs, files in os.walk(directoryName): 
    for f in files: 
     if f.endswith(".txt") 
     f1=f 
     path1=path   
     p=mp.Process(target=convert1, args=(path1,f1,)) 
    p.start() 

アイデアはありますか?

+1

ループ外で 'p.start()'を呼び出すのは難しいです。最後に作成された 'p'のみが起動されます。 –

+0

ファイルが1つしかないのでうまくいかなかったかもしれませんが、いくつかのファイルを試してみると結果が出ます。 –

答えて

1

あなたのコードは毎回pを上書きするので、ループが終了したときには1つのプロセスしか開始しません。あなたが最終的にすべてのプロセスにjoinを呼び出すことができるように

代わりに、あなたがプロセスを作成するときにp.startを呼び出し、それを格納します。

def convert (directoryName): 
    process_list = [] 
    for path, dirs, files in os.walk(directoryName): 
    for f in files: 
     if f.endswith(".txt") 
     f1=f 
     path1=path   
     p=mp.Process(target=convert_stdf_hdf5, args=(path1,f1,)) 
     p.start() 
     process_list.append(p) 
    # wait for processes to finish 
    for p in process_list: 
    p.join() 
+0

ありがとうございます。私はあなたのコードをステップバイステップで試しましたが、関数convertは実行されていないようです。それは私が__name__ == '__main__':? –

+0

ああ、窓では、もしそれが__name __ == "__ main __" 'に置かれる必要があるのは、プロセスの重複問題のためです。 –

+0

それは今作動する!どうもありがとうございました。 –

0

あなたは簡単にStarmapのを使用してそれを行うことができます。 (Python3.3以降)

import os 
from multiprocessing import Pool 

def convert(directoryName): 
    p = Pool() 
    args = [] 
    for path, dirs, files in os.walk(directoryName): 
     args.extend([[path, f] for f in files if f.endswith('.txt')]) 
    p.starmap(convert_stdf_hdf5, args) 

if __name__ == '__main__': 
    convert('path/to/target/') 
+0

残念ながら、私は2.7を使用します。しかし、本当にありがとう、私はそれがこの投稿を見る人を助けることを願っています。 –

関連する問題