পাইথন লাইব্রেরির '_thread' মডিউলটি গ্লোবাল ডেটা স্পেস শেয়ার করার একাধিক থ্রেড সহ হালকা-ওজন প্রক্রিয়াগুলির সাথে কাজ করার জন্য একটি নিম্ন-স্তরের ইন্টারফেস প্রদান করে। সিঙ্ক্রোনাইজেশনের জন্য, এই মডিউলে সাধারণ লকগুলি (যাকে মিউটেক্স বা বাইনারি সেমাফোরসও বলা হয়) সংজ্ঞায়িত করা হয়েছে। 'থ্রেডিং' বিল্ট-ইন মডিউল এই মডিউলের উপরে তৈরি একটি উচ্চ-স্তরের থ্রেডিং API প্রদান করে।
start_new_thread()
এই মডিউল-স্তরের ফাংশনটি বর্তমান প্রক্রিয়ায় একটি নতুন থ্রেড খুলতে ব্যবহৃত হয়। ফাংশন একটি আর্গুমেন্ট হিসাবে একটি ফাংশন অবজেক্ট নেয়। নতুন থ্রেড সফলভাবে তৈরি করার জন্য এই ফাংশনটি চালু করা হয়। এই ফাংশনের স্প্যানটি থ্রেডের আয়ুষ্কালের সাথে মিলে যায়। স্লিপ() ফাংশন কল করে থ্রেড ব্লক করা হতে পারে।
নিম্নলিখিত কোড হল _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() ফাংশন একটি নতুন থ্রেড তৈরি করে যা সমান্তরালভাবে রান ফাংশনকে কল করে। রান() ফাংশনের পাশাপাশি প্রোগ্রামের মূল থ্রেডে একটি লুপ রয়েছে। কল টু স্লিপ() ফাংশন উভয় ক্ষেত্রেই ওভারল্যাপড এক্সিকিউশনের ফলে নীচে দেখানো হয়েছে:−
main 1 child 1 main 2 child 2 main 3 child 3 main 4 child 4 main 5 child 5
লক অবজেক্ট ব্যবহার করে ইন্টার-থ্রেড সিঙ্ক্রোনাইজেশন অর্জন করা হয়। allocate_lock() ফাংশন লক অবজেক্ট প্রদান করে। এর জন্য নিম্নলিখিত পদ্ধতিগুলি উপলব্ধ রয়েছে
অধিগ্রহণ()
এই পদ্ধতিটি অন্য থ্রেড দ্বারা মুক্তি না হওয়া পর্যন্ত নিঃশর্তভাবে লকটি অর্জন করে। একবারে শুধুমাত্র একটি থ্রেড একটি লক অর্জন করতে পারে। লকটি সফলভাবে অর্জিত হলে ফেরত মান সত্য, না হলে মিথ্যা।
রিলিজ()
এই পদ্ধতি লক রিলিজ. লকটি অবশ্যই আগে অর্জিত হয়েছে, তবে একই থ্রেড দ্বারা অগত্যা নয়৷
৷নিম্নলিখিত উদাহরণে, দুটি থ্রেড ঘোষণা করা হয়। প্রতিটি রান() ফাংশন একই সাথে আহ্বান করে। তাদের মধ্যে একজন লকটি অর্জন করে এবং অন্যরা অপেক্ষা করার সময় 'সিঙ্ক্রোনাইজড' ফাংশনে প্রবেশ করতে এগিয়ে যায়।
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