pythonで処理を並列化したいのですができません。
実行すると結果は出るのですが並列しない場合と結果が異なってしまいます。
そこで質問なのですが、
①書き換え方はあっているのか。
②並列化することによってうまく機能しないコードが存在するのか。
の二つです。
python
1 sigmoid_filenames = [] 2 for name in files: 3 sigmoid_filenames.append([name,main(name)]) 4 5#上のループを書き換えたもの 6for name in files: 7 filenames.append([name]) 8 data=Parallel(n_jobs=-1)([delayed(main)(name) for name in files]) 9
実行したい関数はmainと名付けています。
上のコードではファイル名とmain関数の返り値を配列に入れています。
質問のコードだけではどこに問題があるかわかりません。
マルチスレッドでコードを動かす場合、スレッドセーフとなるようにコードを書く必要があります。つまり、マルチスレッドで実行する関数を気をつけて書かないと意図通り動かなくなります。
回答ありがとうございます。
まったく並列化したことがなく知識もなく申し訳ないのですが、
解釈としては
”関数内でデータの受け渡しがある際、並列処理の際に取り違えてしまう可能性があるためロックを行いスレッドセーフにする必要がある”
といった感じでしょうか。
グローバルな変数を参照していないか、ライブラリを使っている場合はそのライブラリがスレッドセーフ (マルチスレッドに対応しているかどうか)、関数内で乱数を使っていないかなどです。
あと複数のスレッドで共通の変数を参照するような場合は、mutex でロックして同時に参照されることがないようにする必要もあります。
ライブラリかもしれないので一度しらべてみようと思います。
アドバイスありがとうございます。