web-dev-qa-db-ja.com

multiprocessing.Processから戻り値を取得できますか?

Python multiprocessingモジュールを使用して、モンテカルロコードにいくつかの単純な並列処理を実装しました。次のようなコードがあります。

montecarlos = [MonteCarlo(f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [mc.results for mc in montecarlos]

ただし、結果リストを見ると、モンテカルロイテレータはまだ開始されていないようです。モンテカルロのステップ中にプロセスに情報を出力させることができるので、それらがあることを知っています。だから私は何か馬鹿げている。 job.join()は、すべてが実行されるまで結果リストが作成されないようにし、mc.resultsフィールドが更新されると考えていました。

モンテカルロルーチンの詳細を説明していないことに気付き、それが重要ではなく、私が犯している間違いがマルチプロセシングの解釈にあることを願っています。あなたが提供できる助けを事前に感謝します。

31
Rick

MonteCarloオブジェクトがピクルされ、実行される子プロセスに送信されました-ローカルmcが実行されたことがないため、このプロセスの.results属性は設定されません。

multiprocessing.Queue を作成すると、それを各MonteCarloジョブに渡すことができ、終了したら結果をそこに入れる必要があります。その後、トップレベルはキューからの値を待つことができます。 (フードの下では、結果オブジェクトをピクルスおよびピクルス解除します。)

result_queue = multiprocessing.Queue()
montecarlos = [MonteCarlo(result_queue, f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [result_queue.get() for mc in montecarlos]
41
babbageclunk