ভূমিকা
এই উদাহরণে, আমরা একটি টাস্ক কিউ তৈরি করব যা সমস্ত এক্সিকিউট করার জন্য টাস্ক ধারণ করবে এবং একটি থ্রেড পুল যা কিউর সাথে ইন্টারঅ্যাক্ট করে এর উপাদানগুলিকে আলাদা করে প্রক্রিয়া করবে।
কিউ কী?
কিউ হল একটি ডেটা স্ট্রাকচার যা বিভিন্ন উপাদানের সংগ্রহ যাকে একটি নির্দিষ্ট ক্রমে রক্ষা করে। একটি বাস্তব জীবনের উদাহরণ দিয়ে ব্যাখ্যা করি।
ধরুন আপনি একটি גרোসারি দোকানের কাউন্টারে বিল পরিশোধ করার জন্য লাইনে দাঁড়িয়েছেন।
মানুষের লাইনে আপনি নিম্নলিখিত বিষয়গুলি লক্ষ্য করবেন:
- মানুষ লাইনের এক প্রান্তে প্রবেশ করে এবং অন্য প্রান্ত থেকে বের হয়।
- যদি ব্যক্তি A, ব্যক্তি B-এর আগে লাইনে প্রবেশ করে, তবে ব্যক্তি A, ব্যক্তি B-এর আগে লাইন ছাড়বে (যদি না B সেলিব্রিটি বা উচ্চ অগ্রাধিকার সম্পন্ন হয়)।
- সবার বিল পরিশোধ হয়ে গেলে লাইনে কেউ থাকবে না।
প্রোগ্রামিং-এ কিউ একইভাবে কাজ করে:
- enqueue - উপাদান কিউর শেষে যোগ করা হয়।
- dequeue - উপাদান কিউর শুরু থেকে সরানো হয়।
আরও রয়েছে: FIFO (First In First Out) - প্রথমে যোগ করা উপাদান প্রথমে বের হয়। LIFO (Last In First Out) - শেষে যোগ করা উপাদান প্রথমে বের হয়।
পাইথন কিউ ডেটা স্ট্রাকচার কীভাবে বাস্তবায়ন করে?
পাইথনের queue মডিউল কিউ ডেটা স্ট্রাকচারের একটি সহজ বাস্তবায়ন প্রদান করে। প্রতিটি কিউতে নিম্নলিখিত মেথড থাকে:
get(): পরবর্তী উপাদান ফেরত দেয়।put(): নতুন উপাদান যোগ করে।qsize(): কিউতে বর্তমান উপাদান সংখ্যা।empty(): বুলিয়ান ফেরত দেয়, কিউ খালি কিনা নির্দেশ করে।full(): বুলিয়ান ফেরত দেয়, কিউ পূর্ণ কিনা নির্দেশ করে।
উদাহরণ: গুণফল ফাংশন
আমরা একটি ফাংশন তৈরি করব যা একটি আর্গুমেন্ট x নেয়, তারপর 1 থেকে x পর্যন্ত সংখ্যাগুলির মাধ্যমে ইটারেট করে গুণফল করবে। উদাহরণস্বরূপ, 5 পাস করলে এটি 1 থেকে 5 পর্যন্ত ইটারেট করে গুণফল করবে (১×৫, ২×৫, ৩×৫, ৪×৫, ৫×৫) এবং মানগুলিকে একটি লিস্ট হিসেবে ফেরত দেবে।
def print_multiply(x):
output_value = []
for i in range(1, x + 1):
output_value.append(i * x)
print(f"Output \n *** The multiplication result for the {x} is - {output_value}")
print_multiply(5)
আউটপুট
*** The multiplication result for the 5 is - [5, 10, 15, 20, 25]
কিউ প্রক্রিয়া ফাংশন
আমরা process_queue() নামে একটি ফাংশন লিখব যা কিউ অবজেক্টের পরবর্তী উপাদান পাওয়ার চেষ্টা করবে। লজিক সহজ: কিউ খালি না হওয়া পর্যন্ত উপাদান পাস করুন। আমি কিছু বিলম্বের জন্য sleep ব্যবহার করব।
def process_queue():
while True:
try:
value = my_queue.get(block=False)
except queue.Empty:
return
else:
print_multiply(value)
time.sleep(2)
মাল্টিথ্রেড ক্লাস
একটি ক্লাস তৈরি করব, নতুন ইনস্ট্যান্স आरম্ভ এবং শুরু হলে process_queue() ফাংশন কল হবে।
class MultiThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
print(f" ** Starting the thread - {self.name}")
process_queue()
print(f" ** Completed the thread - {self.name}")
ইনপুট লিস্ট দিয়ে কিউ পূরণ
# ভেরিয়েবল সেটআপ
input_values = [5, 10, 15, 20]
# কিউ পূরণ
my_queue = queue.Queue()
for x in input_values:
my_queue.put(x)
সম্পূর্ণ কোড একসাথে
import queue
import threading
import time
# ক্লাস
class MultiThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
print(f"Output \n ** Starting the thread - {self.name}")
process_queue()
print(f" ** Completed the thread - {self.name}")
# কিউ প্রক্রিয়া
def process_queue():
while True:
try:
value = my_queue.get(block=False)
except queue.Empty:
return
else:
print_multiply(value)
time.sleep(2)
# গুণফল ফাংশন
def print_multiply(x):
output_value = []
for i in range(1, x + 1):
output_value.append(i * x)
print(f" \n *** The multiplication result for the {x} is - {output_value}")
# ইনপুট ভেরিয়েবল
input_values = [2, 4, 6, 5, 10, 3]
# কিউ পূরণ
my_queue = queue.Queue()
for x in input_values:
my_queue.put(x)
# ৩টি থ্রেড ইনিশিয়ালাইজ এবং শুরু
thread1 = MultiThread('First')
thread2 = MultiThread('Second')
thread3 = MultiThread('Third')
thread4 = MultiThread('Fourth')
# থ্রেড শুরু
thread1.start()
thread2.start()
thread3.start()
thread4.start()
# থ্রেড জয়েন
thread1.join()
thread2.join()
thread3.join()
thread4.join()
আউটপুট বিশ্লেষণ
আউটপুটে দেখা যাচ্ছে ৪টি থ্রেড আছে কিন্তু ৬টি মান প্রক্রিয়া করতে হবে। যেই থ্রেডটি প্রথম কিউর কাছে পৌঁছাবে সেটি এক্সিকিউট হবে, বাকিরা অপেক্ষা করবে। এটি বাস্তব জীবনের মতো: ৩টি কাউন্টার আছে কিন্তু ১০জন লাইনে দাঁড়িয়েছে, যারা বিল পরিশোধ করে বের হয় তার জায়গায় পরের ব্যক্তি আসে।