ভূমিকা
queue মডিউল ফাস্ট-ইন, ফাস্ট-আউট (FIFO), লাস্ট-ইন, ফাস্ট-আউট (LIFO) ডেটা স্ট্রাকচার প্রদান করে যা মাল্টি-থ্রেডেড প্রোগ্রামিং-এর জন্য উপযুক্ত। কিউ ব্যবহার করে ডেটা বা যেকোনো তথ্য (সেশন ডিটেইলস, পাথ, ভেরিয়েবল) ক্রিয়েটর এবং কনসিউমার থ্রেডের মধ্যে নিরাপদে পাস করা যায়। লকিং সাধারণত কলারের জন্য হ্যান্ডেল করা হয়।
নোট: এই আলোচনা অনুমান করে আপনি কিউর সাধারণ প্রকৃতি বুঝছেন। যদি না বুঝেন, তবে আগে কিছু রেফারেন্স পড়ুন।
১. বেসিক FIFO কিউ বাস্তবায়ন
import queue
fifo = queue.Queue()
# কিউতে নম্বর যোগ করুন
for i in range(5):
fifo.put(i)
# খালি না হলে কিউ থেকে নম্বর বের করুন
print(f"Ouput \n")
while not fifo.empty():
print(f" {fifo.get()} ")
আউটপুট
0 1 2 3 4
২. একক থ্রেডে উপাদান অর্ডার
উপরের উদাহরণে একক থ্রেড ব্যবহার করা হয়েছে যা দেখায় উপাদানগুলো কিউতে যোগ করা ক্রমেই বের হচ্ছে।
৩. বেসিক LIFO কিউ বাস্তবায়ন
import queue
lifo = queue.LifoQueue()
for i in range(5):
lifo.put(i)
print(f"Ouput \n")
while not lifo.empty():
print(f" {lifo.get()} ")
আউটপুট
4 3 2 1 0
৪. সবচেয়ে الأخيرে যোগ করা উপাদান get() দিয়ে বের হয়।
৫. প্রায়োরিটি কিউ বাস্তবায়ন
কখনো কখনো কিউতে আইটেমের প্রক্রিয়া অর্ডার প্রায়োরিটি ভিত্তিক হতে হয়, শুধু সৃষ্টি বা যোগ করার ক্রম অনুযায়ী নয়। উদাহরণস্বরূপ, প্রোডাকশনে chạy হচ্ছে একটি বизনেস-ক্রিটিক্যাল জব যেটি সর্বোচ্চ CPU এবং অগ্রাধিকার চায়, একটি ডেভেলপারের প্রিন্ট জবের চেয়ে। PriorityQueue কিউর কন্টেন্টের সর্ট অর্ডার ব্যবহার করে কোন আইটেম রিট্রিভ করা হবে সেটি নির্ধারণ করে।
import queue
import threading
# প্রায়োরিটি এবং ডেসক্রিপশন নিয়ে ক্লাস, প্রায়োরিটি ভ্যালিডেট করে
class Job:
def __init__(self, priority, description):
self.priority = priority
self.description = description
print('New job:', description)
return
def __eq__(self, other):
try:
return self.priority == other.priority
except AttributeError:
return NotImplemented
def __lt__(self, other):
try:
return self.priority < other.priority
except AttributeError:
return NotImplemented
# প্রায়োরিটি কিউ তৈরি এবং প্রায়োরিটি ডিফাইন
q = queue.PriorityQueue()
q.put(Job(90, 'Developer-Print job'))
q.put(Job(2, 'Business-Report job'))
q.put(Job(1, 'Business-Critical Job'))
# জব প্রক্রিয়া ফাংশন
def process_job(q):
while True:
next_job = q.get()
print(f" *** Now, Processing the job - {next_job.description}")
q.task_done()
# থ্রেড ডিফাইন
workers = [
threading.Thread(target=process_job, args=(q,)),
threading.Thread(target=process_job, args=(q,)),
]
# থ্রেড কল এবং জয়েন
for w in workers:
w.setDaemon(True)
w.start()
q.join()
আউটপুট
New job: Developer-Print job
New job: Business-Report job
New job: Business-Critical Job
*** Now, Processing the job - Business-Critical Job
*** Now, Processing the job - Business-Report job
*** Now, Processing the job - Developer-Print job
৬. ব্যাখ্যা
এই উদাহরণে একাধিক থ্রেড জব কনসিউম করছে, যেগুলো কিউতে আইটেমের প্রায়োরিটি অনুযায়ী প্রক্রিয়া হচ্ছে get() কল করার সময়। প্রক্রিয়া অর্ডার বিননেস ক্রিটিক্যালিটির ভিত্তিতে নির্ধারিত হচ্ছে, নাকি সেগুলো কোন ক্রমে যোগ করা হয়েছে তার উপর।