ব্যারিয়ার (Barrier) পাইথনের একটি সিনক্রোনাইজেশন টেকনিক যার মাধ্যমে এক বা একাধিক থ্রেড একটি নির্দিষ্ট পয়েন্টে পৌঁছে একসাথে অগ্রসর হওয়ার জন্য অপেক্ষা করে।
ব্যারিয়ার অবজেক্ট ডিফাইন করতে threading.Barrier ব্যবহার করা হয়।
threading.Barrier(parties, action=None, timeout=None)
যেখানে,
parties = থ্রেডের সংখ্যা
action = থ্রেডগুলো রিলিজ হয়ে যাওয়ার সময় যেকোনো একটি থ্রেড দ্বারা কল করা হবে।
timeout = ডিফল্ট টাইমআউট ভ্যালু। যদি
wait()-এ কোনো টাইমআউট ভ্যালু নির্দিষ্ট না করা থাকে, তবে এই টাইমআউট ভ্যালু ব্যবহার হয়।
Barrier ক্লাস দ্বারা নিচের মেথডগুলো ব্যবহার করা হয়:
| Sr.No | মেথড ও বর্ণনা | |
|---|---|---|
| 1 | parties সাধারণ ব্যারিয়ার পয়েন্টে পৌঁছানোর জন্য প্রয়োজনীয় থ্রেডের সংখ্যা। | |
| 2 | n_waiting সাধারণ ব্যারিয়ার পয়েন্টে অপেক্ষारत থ্রেডের সংখ্যা। | |
| 3 | broken | একটি বুলিয়ান ভ্যালু, True- যদি ব্যারিয়ার ব্রোকেন স্টেটে থাকে, অন্যথায় False। |
| 4 | wait(timeout=None) নোটিফাই হওয়া বা টাইমআউট হওয়া পর্যন্ত অপেক্ষা করুন। যদি কলিং থ্রেড এই মেথড কল করার সময় লক অর্জন না করে, তবে রানটাইম এরর রেইজ হবে। এই মেথডটি আন্ডারলাইনিং লক রিলিজ করে এবং তারপর ব্লক করে যতক্ষণ না এটি অন্য থ্রেডের notify() বা notify_all() কল দ্বারা জেগে উঠে বা অপশনাল টাইমআউট ঘটে। একবার জেগে উঠলে বা টাইমআউট হলে, এটি লক পুনরায় অর্জন করে এবং রিটার্ন করে।যদি timeout আর্গুমেন্ট উপস্থিত থাকে এবং None না হয়, তবে এটি সেকেন্ডে (অথবা এর ভগ্নাংশে) অপারেশনের জন্য টাইমআউট নির্দিষ্ট করে এমন একটি ফ্লোটিং পয়েন্ট নম্বর হওয়া উচিত। | |
| 5 | reset() | ব্যারিয়ারকে ডিফল্ট স্টেটে (অর্থাৎ খালি স্টেটে) সেট বা রিটার্ন করে। এবং যেসব থ্রেড এতে অপেক্ষা করছেন তারা BrokenBarrierError পাবে। |
| 6 | abort() | এটি ব্যারিয়ারকে ব্রোকেন স্টেটে বিয়ে দেবে। এটি সক্রিয় সব থ্রেড বা wait()-এর যেকোনো ভবিষ্যতের কলকে BrokenBarrierError দিয়ে ফেল করবে। |
barrierThread.py
from random import randrange
from threading import Barrier, Thread
from time import ctime, sleep
num = 4 # ৪টি থ্রেড এই ব্যারিয়ার পাস করবে রিলিজ হওয়ার জন্য।
b = Barrier(num)
names = ['India', 'Japan', 'USA', 'China']
def player():
name = names.pop()
sleep(randrange(2, 5))
print('%s reached the barrier at: %s \n' % (name, ctime()))
b.wait()
threads = []
print("Race starts now...")
for i in range(num):
threads.append(Thread(target=player))
threads[-1].start()
""" নিচের লুপটি থ্রেডগুলো সম্পূর্ণ হওয়া পর্যন্ত মেন স্ক্রিপ্টে অপেক্ষা করতে সক্ষম করে। """
for thread in threads:
thread.join()
print("All Reached Barrier Point!")
ফলাফল
Race starts now... India reached the barrier at: Fri Jan 18 14:07:44 2019 China reached the barrier at: Fri Jan 18 14:07:44 2019 Japan reached the barrier at: Fri Jan 18 14:07:46 2019 USA reached the barrier at: Fri Jan 18 14:07:46 2019 All Reached Barrier Point!