পাইথন লাইব্রেরির '_thread' মডিউল লাইটওয়েট প্রসেসের সাথে কাজ করার জন্য একটি লো-লেভেল ইন্টারফেস প্রদান করে যাদের একাধিক থ্রেড একটি গ্লোবাল ডেটা স্পেস শেয়ার করে। সিঙ্ক্রোনাইজেশনের জন্য এই মডিউলে সিম্পল লক (যাকে মিউটেক্স বা বাইনারি সেমাফোরও বলা হয়) সংজ্ঞায়িত রয়েছে। 'threading' বিল্ট-ইন মডিউল এই মডিউলের উপরে নির্মিত একটি হাই-লেভেল থ্রেডিং API প্রদান করে।
start_new_thread()
এই মডিউল-লেভেল ফাংশন বর্তমান প্রসেসে একটি নতুন থ্রেড খোলার জন্য ব্যবহৃত হয়। ফাংশনটি একটি ফাংশন অবজেক্ট আর্গুমেন্ট হিসেবে নেয়। নতুন থ্রেড সফলভাবে তৈরি হলে এই ফাংশনটি আহ্বান করা হয়। এই ফাংশনের জীবনকাল থ্রেডের জীবনকালের সমান। থ্রেডটি sleep() ফাংশন কল করে ব্লক করা যেতে পারে।
নিচের কোড _thread মডিউল ব্যবহার করে থ্রেড মেকানিজমের একটি সাধারণ উদাহরণ:
import _thread
import time
def run(threadName):
count = 0
for i in range(1, 6):
time.sleep(5)
print(threadName, i)
_thread.start_new_thread(run, ("child",))
for i in range(1, 6):
print('main', i)
time.sleep(5)
start_new_thread() ফাংশন একটি নতুন থ্রেড তৈরি করে যা run ফাংশনকে সমান্তরালভাবে কল করে। run() ফাংশনে এবং প্রোগ্রামের মেইন থ্রেডে লুপ রয়েছে। উভয় ক্ষেত্রে sleep() ফাংশন কলের ফলে ওভারল্যাপড এক্সিকিউশন হয়:
main 1 child 1 main 2 child 2 main 3 child 3 main 4 child 4 main 5 child 5
ইন্টার-থ্রেড সিঙ্ক্রোনাইজেশন
ইন্টার-থ্রেড সিঙ্ক্রোনাইজেশন Lock অবজেক্ট ব্যবহার করে অর্জন করা হয়। allocate_lock() ফাংশন লক অবজেক্ট রিটার্ন করে। এর জন্য নিচের মেথডগুলো উপলব্ধ:
acquire()
এই মেথড লকটি безশর্ত অর্জন করে যতক্ষণ না অন্য কোনো থ্রেড সেটি রিলিজ করে। একবারে শুধু একটি থ্রেড লক অর্জন করতে পারে। রিটার্ন ভ্যালু True হয় যদি লক সফলভাবে অর্জিত হয়, অন্যথায় False।
release()
এই মেথড লকটি রিলিজ করে। লকটি আগে অর্জিত থাকতে হবে, তবে অনিবার্যভাবে একই থ্রেড দ্বারা নয়।
নিচের উদাহরণে দুটি থ্রেড ঘোষণা করা হয়েছে। প্রতিটি একসাথে run() ফাংশন আহ্বান করে। उनमें से একটি লক অর্জন করে 'synchronized' ফাংশনে প্রবেশ করে যখন অন্যটি অপেক্ষা করে।
import _thread
import time
def run(threadName):
lock.acquire()
synchronized(threadName)
lock.release()
def synchronized(threadName):
print(threadName, "has acquired lock")
counter = 10
while counter:
time.sleep(1)
print('*', end='')
counter = counter - 1
print('\n{} has released lock'.format(threadName))
lock = _thread.allocate_lock()
_thread.start_new_thread(run, ("t1",))
_thread.start_new_thread(run, ("t2",))
আউটপুট
>>> t1 has acquired lock ********** t1 has released lock t2 has acquired lock ********** t2 has released lock