2011-11-30 12 views
27

मैंने पाइथन मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करके मोंटे कार्लो कोड में कुछ सरल समांतरता लागू की है।क्या मुझे 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] 

हालांकि, जब मैं परिणामों की सूची को देखो, यह लग रहा है मोंटे कार्लो iterators की तरह भी शुरू नहीं किया है: मैं कोड है कि लगता है कि नहीं है। मुझे पता है कि उनके पास है, क्योंकि मैं प्रक्रियाओं को मोंटे कार्लो चरणों के दौरान जानकारी प्रिंट कर सकता हूं। तो मैं कुछ गूंगा कर रहा हूँ। मैंने सोचा था कि 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

संबंधित मुद्दे