6

में multiprocessing.queue (-1) को खाली करने का पसंदीदा तरीका मैं वर्तमान में एक कतार में सभी आइटम खींचना चाहता हूं। एक और थ्रेड लगातार दूसरे छोर में वस्तुओं को डाल रहा है, और हर अवधि में मैं वर्तमान में कतार में सभी आइटम प्राप्त करना चाहता हूं।पायथन

वहाँ पसंद करते हैं करने के लिए किसी कारण है:

res = [] 
while q.qsize > 0 : 
    res.append(q.get()) 

या

res = [] 
while True : 
    try : 
     res.append(q.get(block=False)) 
    except Queue.Empty : 
     break 

अब डॉक्स विशेष रूप से कहना है कि qsize()> 0 कतार एक get पर अवरुद्ध करने से नहीं रोका जाएगा, लेकिन क्या यह केवल उस मामले में सच है जहां आउटपुट से कई धागे ले सकते हैं?

कतार। qsize() कतार के अनुमानित आकार को वापस करें। नोट, qsize()> 0 इस बात की गारंटी नहीं देता है कि बाद में मिलता है() ब्लॉक नहीं करेगा, और न ही qsize() < अधिकतम गारंटी जो डाल देगा() ब्लॉक नहीं करेगा।

क्या इसका मतलब यह है कि दूसरा रूप हमेशा पसंद किया जाना चाहिए? ईएएफपी और वह सब? साथ ही, q.qsize() को कॉल करने के लिए कोई कीमत है? क्या यह गिनने के लिए कतार के दूसरे छोर को अवरुद्ध करता है?

मुझे लगता है कि मैंने दूसरे फॉर्म का उपयोग करने में खुद से बात की है लेकिन यह मेरे लिए बहुत कम साफ है।

उत्तर

5

हां, आपको हमेशा दूसरे संस्करण का उपयोग करना चाहिए: एपीआई का दस्तावेज़ीकरण आमतौर पर कार्यान्वयन के अनियंत्रित विनिर्देशों से अधिक विश्वसनीय होना चाहिए। भले ही वर्तमान multiprocessing कार्यान्वयन इस तरह काम करता है कि आपके विशेष मामले में get()qsize() > 0 को अवरुद्ध नहीं करेगा, यह गारंटी नहीं है कि यह पाइथन के भविष्य के संस्करणों में इस तरह रहेगा, क्योंकि दस्तावेज़ पहले से ही स्पष्ट रूप से बताता है कि यह नहीं है।

कहा जा रहा है कि, पाइथन के वर्तमान संस्करणों के साथ पहले संस्करण को विश्वसनीय और साथ ही लंबे समय तक काम करना चाहिए क्योंकि आपके पास केवल एक उपभोग करने वाली प्रक्रिया है। कॉलिंग qsizeintenally invokes sem_getvalue on Linux and WaitForSingleObjectEx on Windows; दोनों कुछ भी ताला नहीं है। (लिनक्स कॉल के लिए, यह विंडोज़ कॉल के लिए मैनपेज में दस्तावेज है, यह एक मजबूत अनुमान है।)

ध्यान दें कि यदि आपके पास एकाधिक उपभोक्ता हैं और यह सुनिश्चित करना चाहते हैं कि उनमें से एक पूरी कतार पढ़ता है, तो आपके पास अपने लूप को संलग्न करने वाले अतिरिक्त लॉक का उपयोग करने के लिए!