2012-11-30 28 views
5

मैं अपने प्रोजेक्ट में मल्टीप्रोसेसिंग का उपयोग कर रहा हूं। मेरे पास एक कार्यकर्ता कार्य है जो परिणामों को कतार में डालता है। सब कुछ ठीक काम करता है। लेकिन एक्स के आकार के रूप में बढ़ता है (मेरे मामले में एक्स एक सरणी है) कुछ गलत हो गया।पाइथन में मल्टीप्रोसेसिंग अवरुद्ध

def do_work(queue, x): 
    result = heavy_computation_function(x) 
    queue.put(result) # PROBLEM HERE 

def parallel_something(): 
    queue = Queue() 
    procs = [Process(target=do_work, args=i) for i in xrange(20)] 
    for p in procs: p.start() 
    for p in procs: p.join() 

    results = [] 
    while not queue.empty(): 
     results.append(queue.get) 

    return results 

मैं प्रणाली में देख अजगर प्रक्रियाओं काम कर रहा है, लेकिन फिर कुछ होता है और सभी प्रक्रियाओं चल रहा है, लेकिन कुछ भी नहीं कर रहे हैं पर नजर रखने के: यहाँ मेरी कोड का एक सरलीकृत संस्करण है। Ctrl-d टाइप करते समय मुझे यही मिलता है।

pid, sts = os.waitpid(self.pid, flag) 
KeyboardInterrupt 

मैं कुछ परीक्षण करता हूं। और समस्या वास्तव में कतार में परिणाम डालने की तरह दिखती है अगर मैं परिणाम सब कुछ नहीं डालता लेकिन फिर कोई उद्देश्य नहीं होगा।

+4

आप कभी भी नई प्रक्रिया में कतार वस्तु को पारित नहीं कर रहे हैं। 'प्रक्रिया 'का' तर्क 'भी' tuple' होना चाहिए। इसे 'args = (कतार, i)' में बदलने का प्रयास करें। आपकी 'queue.get' को कुछ ब्रैकेट की भी आवश्यकता है ताकि यह' queue.get() 'हो। – Wessie

उत्तर

3

ठीक है, ऐसा लगता है कि यह पाइथन के कतार मॉड्यूल में कुछ बग है। वास्तव में उपयोग करते हुए ..

from multiprocessing import Manager 

queue = Manager().Queue() 

काम करता है ..everything लेकिन मैं अभी भी पता नहीं क्यों .. :)

+0

अंतर यह है कि आप 'कतार() 'के बजाय' प्रबंधक()। कतार()' को तत्काल कर रहे हैं। मुझे लगता है कि इसका मतलब है कि 'प्रबंधक .__ init __() 'को पहले फॉर्म में बुलाया जाता है लेकिन दूसरे में नहीं। – Patrick

5

आप सबसे शायद एक गतिरोध पैदा कर रहे हैं।

programming guidelines से

:

इसका मतलब यह है कि जब भी आप एक कतार का उपयोग आप सुनिश्चित करें कि सभी आइटम जो कतार पर डाल दिया है अंततः से पहले प्रक्रिया में शामिल हो गए है हटा दिया जाएगा बनाने की जरूरत है। अन्यथा आप यह सुनिश्चित नहीं कर सकते कि कतारों पर वस्तुओं को रखने वाली प्रक्रियाएं समाप्त हो जाएंगी। यह भी याद रखें कि गैर-डेमोनिक प्रक्रियाएं स्वचालित रूप से जुड़ जाएंगी।

पृष्ठ में एक संभावित फ़िक्स भी प्रस्तावित किया गया है। ध्यान रखें कि यदि प्रक्रियाएं शामिल नहीं होती हैं, तो इसका मतलब यह नहीं है कि वे किसी भी अर्थ में संसाधनों पर कब्जा कर रहे हैं। इसका मतलब यह है कि प्रक्रियाओं के पूरा होने के बाद आप कतारबद्ध डेटा प्राप्त कर सकते हैं (शायद locks का उपयोग कर) और बाद में प्रक्रियाओं में शामिल हो जाएं।

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