2017-12-01 61 views
10

में निर्मित समारोह len() (https://docs.python.org/3/library/functions.html#len) देता है "एक वस्तु की लंबाई (मदों की संख्या)", लेकिन इस queue.Queue (https://docs.python.org/3/library/queue.html) के लिए लागू नहीं है। इसके बजाय, queue.Queue में qsize() विधि है जो एक कतार का अनुमानित आकार देता है, जब इसकी स्पष्ट रूप से लंबाई होती है; आप कन्स्ट्रक्टर में Queue की अधिकतम लंबाई निर्दिष्ट कर सकते हैं। इसी तरह के collections.dequelen के साथ काम करता है।क्यूई के लिए लेन() लागू क्यों नहीं किया गया है?

queue.Queue के लिए सामान्य len() का उपयोग न करने के कारण क्या हैं? या: फ़ंक्शन को सक्षम करने के लिए qsize को __len__ नामित करने के लिए समस्याएं क्या होंगी?

+2

शायद क्योंकि लोग 'लेन' को सटीक मूल्य वापस करने की उम्मीद करते हैं, अनुमानित नहीं। और यह तेज़ होना चाहिए। सटीक '__len__' को लागू करने के लिए कतार को अस्थायी रूप से लॉक किया जाना चाहिए ताकि जोड़ों और निकासी को रोका जा सके, जो प्रदर्शन को प्रभावित करेगा। –

उत्तर

10

len()queue.Queue के लिए लागू नहीं किया गया है क्योंकि यह एक "आकर्षक उपद्रव" होगा: कुछ ऐसा जो केवल एक विशेषज्ञ का उपयोग करने पर विचार करना चाहिए, लेकिन एक "दोस्ताना नाम" गैर विशेषज्ञों को इसका उपयोग करने के लिए प्रोत्साहित करेगा।

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

तो केवल सच बात .qsize() द्वारा दिए गए मान के बारे में कहा जा सकता है कि Queueपर उस में कि कई मूल्यों था अतीत में कुछ समय है। जब तक आप लौटे हुए मूल्य का उपयोग कर सकते हैं, तब तक इसमें मनमाने ढंग से अधिक (या कम) मूल्य हो सकते हैं। लेकिन तब कोई एक Queue के कार्यान्वयन जटिलता के लिए भुगतान करने के लिए (बजाय एक list या एक deque का उपयोग करें) आवश्यकता नहीं है -

पाठ्यक्रम कि नहीं है, इसलिए यदि आप केवल एक ही धागा चला रहे हैं के

+0

तो कतार के लिए 'खाली()' और 'पूर्ण()' लागू क्यों किया गया है? –

+5

यदि मैंने उन्हें लिखा था तो वे 'खाली()' और 'पूर्ण() 'लागू नहीं करेंगे ;-) शुरुआती दिनों में, विभिन्न वैकल्पिक' टाइमआउट = 'तर्क मौजूद नहीं थे, और' पूर्ण()' और '.put()' या '.get() 'सफल होने की संभावना" पर एक सभ्य अनुमान लगाने के लिए _probabilistic_ gimmicks के रूप में loops में' खाली() 'का उपयोग किया गया था। कोड का उपयोग कर कोड (जैसे कि 'qsize() 'का उपयोग कर कोड) अक्सर बग्स के लिए प्रवण नहीं होता है। –

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