multiprocessing ライブラリの Process モジュールを使用して、パフォーマンスを向上させるためにコードをスレッド化しようとしています。
コードの骨組みは、作業対象のスレッドごとに辞書を作成することです。すべての処理が完了すると、辞書が合計されてファイルに保存されます。リソースは次のように作成されます。
histos = {}
for int i in range(number_of_threads):
histos[i] = {}
histos[i]['all'] = ROOT.TH1F objects
histos[i]['kinds_of'] = ROOT.TH1F objects
histos[i]['keys'] = ROOT.TH1F objects
次に、プロセス内で、各スレッドが独自の histos[thread_number] オブジェクトを使用して、含まれている ROOT.TH1Fs を処理します。ただし、私の問題は、どうやら次のように Process でスレッドを開始した場合です。
proc = {}
for i in range(Nthreads):
it0 = 0 + i * n_entries / Nthreads # just dividing up the workload
it1 = 0 + (i+1) * n_entries / Nthreads
proc[i] = Process(target=RecoAndRecoFix, args=(i, it0, it1, ch,histos))
# args: i is the thread id (index), it0 and it1 are indices for the workload,
# ch is a variable that is read-only, and histos is what we defined before,
# and the contained TH1Fs are what the threads put their output into.
# The RecoAndFix function works inside with histos[i], thus only accessing
# the ROOT.TH1F objects that are unique to it. Each thread works with its own histos[i] object.
proc[i].start()
スレッドは histos[i] オブジェクトにアクセスできますが、それらに書き込むことはできません。正確には、TH1F ヒストグラムで Fill() を呼び出すと、オブジェクトは共有変数ではないため、オブジェクトに書き込むことができないため、データは入力されません。
だからここ:https://docs.python.org/3/library/multiprocessing.html 代わりに multiprocessing.Array() を使用して、スレッドによる読み取りと書き込みの両方が可能な配列を作成する必要があることがわかりました。このような:
typecoder = {}
histos = Array(typecoder,number_of_threads)
for int i in range(number_of_threads):
histos[i] = {}
histos[i]['all'] = ROOT.TH1F objects
histos[i]['kinds_of'] = ROOT.TH1F objects
histos[i]['keys'] = ROOT.TH1F objects
ただし、辞書を型として受け入れません。それは動作しません、それは TypeError: unhashable type: 'dict' と言います
では、この問題を解決するための最良のアプローチは何でしょうか? 私が必要とするのは、辞書に格納されているすべての「すべての種類のキー」のインスタンスを各スレッドに渡すことです。これにより、それらは独自に機能します。そして、これらの受信したリソースを書き込むことができなければなりません。
助けてくれてありがとう、そして些細なことを見落としていたらごめんなさい、私は以前にスレッド化されたコードをしましたが、まだpythonではしていません。