だから、PythonのMultiprocessingモジュールを使用して1つのルーチンを高速化しようとしています。ジョブをいくつかのコアに分割することで、いくつかの.csvファイルを読み取れるようにしたいのです。
def csvreader(string):
from numpy import genfromtxt;
time,signal=np.genfromtxt(string, delimiter=",",unpack="true")
return time,signal
次に、この関数を次のように呼び出して呼び出します。
if __name__ == "__main__":
for i in range(0,2):
p = multiprocessing.Process(target=CSVReader.csvreader, args=(string_array[i],))
p.start()
問題は、これが出力を保存しないことです。 私はすべてのフォーラムをオンラインで読んでおり、multiprocessing.queueを使用する方法があるかもしれないことを見ましたが、私はそれをよく理解していません。 簡単で簡単な方法はありますか?
回答:
回答№1は2あなたの最善の策は multiprocessing.Queue
または multiprocessing.Pipe
、この問題のために正確に設計されています。これらを使用すると、プロセス間で安全かつ簡単にデータを送信できます。
の出力を返したい場合 csvreader
関数、別の引数を渡す必要があります multiprocessing.Queue
これを介してデータがメインプロセスに送り返されます。の代わりに return
値を入力してキューに配置し、メインプロセスは後でそれらを取得します。プロセスがそれらを取得しようとするときに準備ができていない場合、デフォルトでは、それらが利用可能になるまでブロック(待機)します。
関数は次のようになります。
def cvsreader(string, q):
q.put(np.genfromtxt(string, delimiter=",", unpack="true"))
メインルーチンは次のとおりです。
if __name__ == "__main__"
q = multiprocessing.Queue()
for i in range(2):
p = multiprocessing.Process(target=csvreader, args=(string_array[i], q,))
p.start()
# Do anything else you need in here
time=np.empty(2,dtype="object")
signal=np.empty(2,dtype="object")
for i in range(2):
time[i], signal[i] = q.get() # Returns output or blocks until ready
# Process my output
あなたが電話する必要があることに注意してください Queue.get()
ために 各 返品したいアイテム。
のドキュメントをご覧ください multiprocessing
モジュール その他の例と情報については。
回答№2の場合は0
の例を使用する ドキュメントの紹介:
if __name__ == "__main__":
pool = Pool(2)
results = pool.map(CSVReader.csvreader, string_array[:2])
print(results)