Python में, स्टैक और क्यू डेटा स्ट्रक्चर्स को लागू करना बहुत आसान है। स्टैक को LIFO कहा जाता है क्योंकि स्टैक "लास्ट-इन, फर्स्ट-आउट" सिद्धांत पर काम करता है और क्यू को FIFO कहा जाता है क्योंकि क्यू "फर्स्ट-इन, फर्स्ट-आउट" सिद्धांत पर काम करता है, और Python में बिल्ट-इन फ़ंक्शन्स कोड को छोटा और सरल बनाते हैं।
Queue मॉड्यूल मल्टी-प्रोड्यूसर, मल्टी-कंज़्यूमर क्यूज़ को इम्प्लीमेंट करता है और यह थ्रेडेड प्रोग्रामिंग में विशेष रूप से उपयोगी है जब सूचना को मल्टीपल थ्रेड्स के बीच सुरक्षित रूप से एक्सचेंज किया जाना चाहिए। इस मॉड्यूल में Queue क्लास सभी आवश्यक लॉकिंग सेमेन्टिक्स को इम्प्लीमेंट करती है और यह Python में थ्रेड सपोर्ट की उपलब्धता पर निर्भर करती है।
यह मॉड्यूल तीन प्रकार की क्यू इम्प्लीमेंट करता है, जो केवल उस क्रम में भिन्न होती हैं जिसमें एंट्रीज़ प्राप्त की जाती हैं। FIFO क्यू के लिए, पहले जोड़े गए टास्क पहले प्राप्त होते हैं और LIFO क्यू के लिए, सबसे हाल ही में जोड़ी गई एंट्री पहली बार प्राप्त होती है (स्टैक की तरह काम करती है)। और प्रायोरिटी क्यू के लिए, एंट्रीज़ सॉर्टेड रखी जाती हैं (heapq मॉड्यूल का उपयोग करके) और सबसे कम मूल्य वाली एंट्री पहले प्राप्त होती है।
यह क्यू मॉड्यूल निम्न क्लासेज और एक्सेप्शन्स डिफाइन करता है।
class Queue.Queue(maxsize=0)
यह FIFO क्यू के लिए कंस्ट्रक्टर है। आर्गुमेंट maxsize एक इंटीजर है जो क्यू में रखे जा सकने वाले आइटम्स की संख्या की ऊपरी सीमा निर्धारित करता है। एक बार यह आकार पहुंचने पर इंसर्शन ब्लॉक हो जाएगा, जब तक क्यू आइटम्स कंज्यूम नहीं हो जाते। यदि maxsize शून्य से कम या बराबर है तो क्यू का आकार अनंत होगा।
class Queue.LifoQueue(maxsize=0)
यह LIFO क्यू के लिए कंस्ट्रक्टर है। आर्गुमेंट maxsize एक इंटीजर है जो क्यू में रखे जा सकने वाले आइटम्स की संख्या की ऊपरी सीमा निर्धारित करता है। एक बार यह आकार पहुंचने पर इंसर्शन ब्लॉक हो जाएगा, जब तक क्यू आइटम्स कंज्यूम नहीं हो जाते। यदि maxsize शून्य से कम या बराबर है तो क्यू का आकार अनंत होगा।
class Queue.PriorityQueue(maxsize=0)
यह प्रायोरिटी क्यू के लिए कंस्ट्रक्टर है। आर्गुमेंट maxsize एक इंटीजर है जो क्यू में रखे जा सकने वाले आइटम्स की संख्या की ऊपरी सीमा निर्धारित करता है। एक बार यह आकार पहुंचने पर इंसर्शन ब्लॉक हो जाएगा, जब तक क्यू आइटम्स कंज्यूम नहीं हो जाते। यदि maxsize शून्य से कम या बराबर है तो क्यू का आकार अनंत है।
exception Queue.Empty
यह लाइन इंगित करती है कि जब नॉन-ब्लॉकिंग get() (या get_nowait()) को खाली Queue ऑब्जेक्ट पर कॉल किया जाता है तो एक्सेप्शन उठाया जाता है।
exception Queue.Full
यह लाइन इंगित करती है कि जब नॉन-ब्लॉकिंग put() (या put_nowait()) को भरे हुए Queue ऑब्जेक्ट पर कॉल किया जाता है तो एक्सेप्शन उठाया जाता है।
क्यू ऑब्जेक्ट्स
Queue.qsize()
यह फ़ंक्शन क्यू के अनुमानित आकार को लौटाता है।
Queue.empty()
यह फ़ंक्शन True लौटाता है यदि क्यू खाली है अन्यथा False। यदि empty() True लौटाता है तो यह गारंटी नहीं देता कि बाद में put() कॉल ब्लॉक नहीं करेगा। इसी तरह, यदि empty() False लौटाता है तो यह गारंटी नहीं देता कि बाद में get() कॉल ब्लॉक नहीं करेगा।
Queue.full()
यदि क्यू भरी हुई है तो True लौटाता है, अन्यथा False। यदि full() True लौटाता है तो यह गारंटी नहीं देता कि बाद में get() कॉल ब्लॉक नहीं करेगा। इसी तरह, यदि full() False लौटाता है तो यह गारंटी नहीं देता कि बाद में put() कॉल ब्लॉक नहीं करेगा।
Queue.put(item[, block[, timeout]])
आइटम को क्यू में डालें। यदि वैकल्पिक आर्ग्स block true है और timeout None है (डिफ़ॉल्ट), तो आवश्यक होने पर ब्लॉक करें जब तक फ्री स्लॉट उपलब्ध न हो। यदि timeout पॉजिटिव नंबर है, तो यह अधिकतम टाइमआउट सेकंड तक ब्लॉक करता है और यदि उस समय के भीतर कोई फ्री स्लॉट उपलब्ध नहीं था तो Full एक्सेप्शन उठाता है। अन्यथा (block false है), यदि फ्री स्लॉट तुरंत उपलब्ध है तो क्यू में आइटम डालें, अन्यथा Full एक्सेप्शन उठाएं (timeout उस मामले में नज़रअंदाज़ किया जाता है)।
Queue.get([block[, timeout]])
क्यू से आइटम को हटाएं और लौटाएं। यदि वैकल्पिक आर्ग्स block true है और timeout None है (डिफ़ॉल्ट), तो आवश्यक होने पर ब्लॉक करें जब तक आइटम उपलब्ध न हो। यदि timeout पॉजिटिव नंबर है, तो यह अधिकतम टाइमआउट सेकंड तक ब्लॉक करता है और यदि उस समय के भीतर कोई आइटम उपलब्ध नहीं था तो Empty एक्सेप्शन उठाता है। अन्यथा (block false है), यदि आइटम तुरंत उपलब्ध है तो लौटाएं, अन्यथा Empty एक्सेप्शन उठाएं (timeout उस मामले में नज़रअंदाज़ किया जाता है)।
Queue.task_done()
इंगित करता है कि पहले से एनक्यूड टास्क पूरा हो गया है। क्यू कंज़्यूमर थ्रेड्स द्वारा उपयोग किया जाता है। प्रत्येक get() जिसका उपयोग टास्क लाने के लिए किया जाता है, उसके बाद task_done() की बाद की कॉल क्यू को बताती है कि टास्क पर प्रोसेसिंग पूरी हो गई है।
यदि join() वर्तमान में ब्लॉकिंग है, तो यह तब रिज्यूम होगा जब सभी आइटम्स प्रोसेस हो चुके हों (मतलब कि हर आइटम के लिए task_done() कॉल प्राप्त हुई हो जिसे क्यू में put() किया गया था)।
यदि क्यू में रखे गए आइटम्स की तुलना में अधिक बार कॉल किया जाता है तो ValueError उठाता है।
Queue.join()
क्यू में सभी आइटम्स प्राप्त होने और प्रोसेस होने तक ब्लॉक करता है।
अनफिनिश्ड टास्क की गिनती तब बढ़ती है जब भी कोई आइटम क्यू में जोड़ा जाता है। गिनती तब घटती है जब भी कंज़्यूमर थ्रेड task_done() कॉल करके इंगित करता है कि आइटम प्राप्त हो गया है और उस पर सभी कार्य पूरे हो गए हैं। जब अनफिनिश्ड टास्क की गिनती शून्य हो जाती है, तो join() अनब्लॉक होता है।
उदाहरण कोड
import queue
# क्यू की अधिकतम क्षमता 20 है
Q = queue.Queue(maxsize=40)
Q.put(50)
Q.put(90)
Q.put(10)
Q.put(70)
print(Q.get())
print(Q.get())
print(Q.get())
print(Q.get())
आउटपुट
50
90
10
70
अंडरफ्लो/ओवरफ्लो का उदाहरण
import queue
Q = queue.Queue(maxsize=30)
print(Q.qsize())
Q.put(50)
Q.put(90)
Q.put(10)
Q.put(70)
print("Full: ", Q.full())
Q.put(90)
Q.put(100)
print("Full: ", Q.full())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print("Full: ", Q.full())
आउटपुट
0
Full: False
Full: False
50
90
10
Empty: False
70
90
100
Empty: True
Full: False
स्टैक का उदाहरण 3
import queue
S = queue.LifoQueue(maxsize=10)
print(S.qsize())
S.put(50)
S.put(90)
S.put(10)
S.put(70)
S.put(90)
S.put(10)
print("Full: ", S.full())
print("Size: ", S.qsize())
# डेटा क्यू के रिवर्स ऑर्डर में एक्सेस होगा
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print("Empty: ", S.empty())
आउटपुट
0
Full: False
Size: 6
10
90
70
10
90
Empty: False