2011-11-30 310 views
27

我使用Python多處理模塊在Monte Carlo代碼中實現了一些簡單的並行性。我有一些代碼看起來像:我可以從multiprocessing.Process獲取返回值嗎?

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] 

然而,當我在看搜索結果列表,它看起來像蒙特卡羅迭代器甚至還沒有開始。我知道他們有,因爲我可以在monte carlo步驟中將流程打印出來。所以我正在做一些愚蠢的事情。我曾認爲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

相關問題