পাইথনে, স্ট্যাক এবং কিউ ডেটা স্ট্রাকচার বাস্তবায়ন করা খুবই সহজ। স্ট্যাককে LIFO বলা হয় কারণ স্ট্যাক "লাস্ট-ইন, ফার্স্ট-আউট" নীতিতে কাজ করে এবং কিউকে FIFO বলা হয় কারণ সারি "ফার্স্ট-ইন, ফার্স্ট-আউট" নীতিতে কাজ করে এবং পাইথনের অন্তর্নির্মিত ফাংশনগুলি কোড ছোট এবং সহজ।
সারি মডিউল বহু-প্রযোজক, বহু-ভোক্তা সারিগুলি প্রয়োগ করে এবং এটি থ্রেডেড প্রোগ্রামিং-এ বিশেষভাবে কার্যকর যখন একাধিক থ্রেডের মধ্যে তথ্য নিরাপদে আদান-প্রদান করা আবশ্যক। এই মডিউলের সারি শ্রেণীটি সমস্ত প্রয়োজনীয় লকিং শব্দার্থ প্রয়োগ করে এবং এটি পাইথনে থ্রেড সমর্থনের উপলব্ধতার উপর নির্ভর করে৷
এই মডিউলটি তিন ধরণের সারি প্রয়োগ করে, যা শুধুমাত্র এন্ট্রিগুলি পুনরুদ্ধার করার ক্রম অনুসারে আলাদা। FIFO সারির জন্য, যুক্ত করা প্রথম কাজগুলি হল প্রথম পুনরুদ্ধার করা হয়েছে এবং LIFO সারির জন্য, সবচেয়ে সম্প্রতি যোগ করা এন্ট্রিটি হল প্রথম পুনরুদ্ধার করা (স্ট্যাকের মতো কাজ করা)। এবং অগ্রাধিকার সারির জন্য, এন্ট্রিগুলিকে সাজানো হয় (heapq মডিউল ব্যবহার করে) এবং সর্বনিম্ন মূল্যবান এন্ট্রিটি প্রথমে পুনরুদ্ধার করা হয়৷
এই সারি মডিউল নিম্নলিখিত শ্রেণী এবং ব্যতিক্রমগুলিকে সংজ্ঞায়িত করে৷
৷শ্রেণীর সারি। সারি(maxsize=0)
এটি একটি FIFO সারির জন্য একটি নির্মাণকারী। আর্গুমেন্ট ম্যাক্সসাইজ হল একটি পূর্ণসংখ্যা যা সারিতে রাখা আইটেমগুলির সংখ্যার উপরের সীমা সীমা সেট করে। একবার এই আকারে পৌঁছে গেলে সন্নিবেশ ব্লক হবে, যতক্ষণ না সারি আইটেমগুলি গ্রাস করা হয়। যদি সর্বাধিক আকার শূন্যের চেয়ে কম বা সমান হয় তবে সারির আকার অসীম হবে৷
শ্রেণী সারি।LifoQueue(maxsize=0)
এটি একটি LIFO সারির জন্য কনস্ট্রাক্টর। আর্গুমেন্ট ম্যাক্সসাইজ হল একটি পূর্ণসংখ্যা যা সারিতে রাখা যেতে পারে এমন আইটেমগুলির সংখ্যার উপরের বাউন্ড সীমা সেট করে। একবার এই আকারে পৌঁছে গেলে সন্নিবেশ ব্লক হবে, যতক্ষণ না সারি আইটেমগুলি গ্রাস করা হয়। যদি সর্বাধিক আকার শূন্যের চেয়ে কম বা সমান হয় তবে সারির আকার অসীম হবে৷
শ্রেণির সারি। অগ্রাধিকার সারি(maxsize=0)
এটি একটি অগ্রাধিকার সারির জন্য কনস্ট্রাক্টর। আর্গুমেন্ট ম্যাক্সসাইজ হল একটি পূর্ণসংখ্যা যা সারিতে রাখা যেতে পারে এমন আইটেমগুলির সংখ্যার উপরের বাউন্ড সীমা সেট করে। একবার এই আকারে পৌঁছে গেলে সন্নিবেশ ব্লক হবে, যতক্ষণ না সারি আইটেমগুলি গ্রাস করা হয়। যদি সর্বাধিক আকার শূন্যের চেয়ে কম বা সমান হয় তবে সারির আকার অসীম।
ব্যতিক্রম সারি। খালি
এই লাইনটি নির্দেশ করে যে ব্যতিক্রমটি উত্থাপিত হয় যখন নন-ব্লকিং get() (বা get_nowait()) একটি সারির বস্তুতে কল করা হয় যা খালি থাকে।
ব্যতিক্রম সারি। সম্পূর্ণ
এই লাইনটি নির্দেশ করে যে ব্যতিক্রমটি উত্থাপিত হয় যখন নন-ব্লকিং put() (বা put_nowait()) কে একটি কিউ অবজেক্টে কল করা হয় যা পূর্ণ থাকে।
সারির বস্তু
Queue.qsize()
এই ফাংশনটি সারির আনুমানিক আকার প্রদান করে।
Queue.empty()
এই ফাংশনটি সত্য প্রদান করে যদি সারি খালি থাকে অন্যথায় মিথ্যা। যদি empty() True রিটার্ন করে তাহলে এটা গ্যারান্টি দেয় না যে পরবর্তী কল to put() ব্লক হবে না। একইভাবে, যদি empty() False রিটার্ন করে তাহলে এটা গ্যারান্টি দেয় না যে পরবর্তী কল to get() ব্লক হবে না।
Queue.full()
সারি পূর্ণ হলে সত্য দেখায়, অন্যথায় মিথ্যা। যদি full() ট্রু রিটার্ন করে তাহলে এটা গ্যারান্টি দেয় না যে পরবর্তী কল to get() ব্লক হবে না। একইভাবে, যদি full() False রিটার্ন করে তাহলে এটা গ্যারান্টি দেয় না যে পরবর্তী কল to put() ব্লক হবে না।
Queue.put(item[, block[, timeout]])
সারিতে আইটেম রাখুন. যদি ঐচ্ছিক args ব্লক সত্য হয় এবং সময় শেষ না হয় (ডিফল্ট), একটি বিনামূল্যে স্লট উপলব্ধ না হওয়া পর্যন্ত প্রয়োজন হলে ব্লক করুন। যদি টাইমআউট একটি ধনাত্মক সংখ্যা হয়, তবে এটি সর্বাধিক টাইমআউট সেকেন্ডে ব্লক করে এবং সেই সময়ের মধ্যে কোনো বিনামূল্যের স্লট উপলব্ধ না হলে সম্পূর্ণ ব্যতিক্রম উত্থাপন করে। অন্যথায় (ব্লক মিথ্যা), যদি একটি বিনামূল্যের স্লট অবিলম্বে পাওয়া যায় তাহলে সারিতে একটি আইটেম রাখুন, অন্যথায় সম্পূর্ণ ব্যতিক্রমটি উত্থাপন করুন (সেক্ষেত্রে সময়সীমা উপেক্ষা করা হয়)।
Queue.get([block[, timeout]])
সারি থেকে একটি আইটেম সরান এবং ফেরত দিন। যদি ঐচ্ছিক args ব্লক সত্য হয় এবং সময় শেষ না হয় (ডিফল্ট), একটি আইটেম উপলব্ধ না হওয়া পর্যন্ত প্রয়োজন হলে ব্লক করুন। যদি টাইমআউট একটি ধনাত্মক সংখ্যা হয়, তবে এটি সর্বাধিক টাইমআউট সেকেন্ডে ব্লক করে এবং সেই সময়ের মধ্যে কোনো আইটেম উপলব্ধ না হলে খালি ব্যতিক্রম উত্থাপন করে। অন্যথায় (ব্লক মিথ্যা), অবিলম্বে উপলব্ধ থাকলে একটি আইটেম ফেরত দিন, অন্যথায় খালি ব্যতিক্রম বাড়ান (সেক্ষেত্রে সময়সীমা উপেক্ষা করা হয়)।
Queue.task_done()
ইঙ্গিত করে যে পূর্বে সারিবদ্ধ টাস্ক সম্পূর্ণ হয়েছে। সারি ভোক্তা থ্রেড দ্বারা ব্যবহৃত. একটি টাস্ক আনতে ব্যবহৃত প্রতিটি get() এর জন্য, task_done() এ একটি পরবর্তী কল কিউকে বলে যে টাস্কের প্রক্রিয়াকরণ সম্পূর্ণ হয়েছে৷
যদি একটি join() বর্তমানে ব্লক করা হয়, তাহলে এটি পুনরায় চালু হবে যখন সমস্ত আইটেম প্রক্রিয়া করা হবে (অর্থাৎ একটি টাস্ক_ডন() কল প্রাপ্ত হয়েছে প্রতিটি আইটেমের জন্য যা() সারিতে রাখা হয়েছিল)।
সারিতে রাখা আইটেমগুলির চেয়ে বেশি বার কল করা হলে একটি মান ত্রুটি উত্থাপন করে৷
Queue.join()
সারিতে থাকা সমস্ত আইটেম অর্জিত এবং প্রক্রিয়া করা না হওয়া পর্যন্ত ব্লক।
যখনই একটি আইটেম সারিতে যোগ করা হয় তখনই অসমাপ্ত কাজের সংখ্যা বেড়ে যায়। আইটেমটি পুনরুদ্ধার করা হয়েছে এবং এটির সমস্ত কাজ সম্পূর্ণ হয়েছে তা নির্দেশ করার জন্য যখনই কোনও গ্রাহক থ্রেড task_done() কল করে তখন গণনা কমে যায়। যখন অসমাপ্ত কাজের সংখ্যা শূন্যে নেমে আসে, জয়েন() আনব্লক করে।
উদাহরণ কোড
import queue #maximum capacity of queue is 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) # qsize() give the maxsize of # the Queue 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()) # Data will be accessed in the # reverse order Reverse of that # of Queue 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