2009-05-29 14 views
16

यह नमूना कोड काम करता है (मैं फ़ाइल में कुछ लिख सकता हूं):पायथन कतार और मल्टीप्रोसेसिंग कतार: वे कैसे व्यवहार करते हैं?

from multiprocessing import Process, Queue 

queue = Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

इसके बजाय यह अन्य नमूना नहीं है: (errormsg: 'मॉड्यूल' ऑब्जेक्ट कॉल करने योग्य नहीं है)

import Queue 

queue = Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

यह अन्य नमूना नहीं है (मैं फ़ाइल में कुछ नहीं लिख सकता):

import Queue 

queue = Queue.Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

क्या कोई मतभेदों को समझा सकता है? और करने का अधिकार?

+2

एक तरफ ध्यान दें: आप भी इस तरह आयात कर सकते हैं: "कतार आयात क़तार से" - इस तरह से आप की तरह आप पहली बार करने की कोशिश की Queue.Queue कॉल करने के लिए सक्षम हो जाएगा - "क़तार()" – Bob

उत्तर

46

अपने दूसरे उदाहरण के लिए, आपने पहले ही स्पष्टीकरण दिया है --- Queue एक मॉड्यूल है, जिसे कॉल नहीं किया जा सकता है।

तीसरे उदाहरण के लिए: मुझे लगता है कि आप Queue.Queue का उपयोग multiprocessing के साथ करते हैं। एक Queue.Queue प्रक्रियाओं के बीच साझा नहीं किया जाएगा। यदि प्रक्रियाओं से पहले Queue.Queue घोषित किया गया है तो प्रत्येक प्रक्रिया को इसकी एक प्रति प्राप्त होगी जो तब हर दूसरी प्रक्रिया से स्वतंत्र होगी। बच्चों को शुरू करने से पहले माता-पिता द्वारा Queue.Queue में रखे गए आइटम प्रत्येक बच्चे के लिए उपलब्ध होंगे। बच्चे को शुरू करने के बाद माता-पिता द्वारा Queue.Queue में रखे गए आइटम केवल माता-पिता के लिए उपलब्ध होंगे। Queue.Queue एक ही प्रक्रिया के अंदर विभिन्न धागे के बीच डेटा इंटरचेंज के लिए बनाया गया है (threading मॉड्यूल का उपयोग करके)। मल्टीप्रोसेसिंग कतार विभिन्न पायथन प्रक्रियाओं के बीच डेटा इंटरचेंज के लिए हैं। जबकि एपीआई समान दिखता है (यह उस तरह से डिजाइन किया गया है), अंतर्निहित तंत्र मूल रूप से अलग हैं।

  • multiprocessing कतारों (serializing) वस्तुओं नमकीन बनाना और पाइप के माध्यम से उन्हें भेज कर डेटा का आदान।
  • Queue.Queue सही व्यवहार के लिए धागे और ताले/म्यूटेक्स के बीच साझा की गई डेटा संरचना का उपयोग करता है।
+3

कारण यह करने के लिए एक मल्टीप्रोसेसिंग का व्यवहार करें। क्यूई आपके द्वारा डाली गई चीजों की एक प्रति प्राप्त करेगा, जबकि कतार। क्यूयू आपके द्वारा डाले गए संदर्भों का संदर्भ देगा। मेरे लिए यह दस्तावेज़ीकरण से पूरी तरह से स्पष्ट नहीं था। – Pelle

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