2011-11-30 8 views
27

私はPythonマルチプロセッシングモジュールを使ってモンテカルロコードで単純な並列処理を実装しました。マルチプロセッシングから戻り値を得ることはできますか?

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フィールドが更新されると考えていました。

私はあなたに私のモンテカルロルーチンの詳細を教えていないことを理解しています。それは問題ではないことを願っています。私が作っている間違いは、マルチプロセッシングの解釈です。あなたが提供できるあらゆる助けを前もって感謝します。

答えて

35

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

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] 
+0

これは素晴らしい機能でした!どうもありがとう!何が起こっているかについてのこのような明確な説明にも感謝します。 – Rick

関連する問題