बैरियर पायथन सिंक्रनाइज़ेशन तकनीकों में से एक प्रदान करता है जिसके साथ एकल या एकाधिक थ्रेड गतिविधियों के एक सेट में एक बिंदु तक प्रतीक्षा करते हैं और एक साथ प्रगति करते हैं।
बैरियर ऑब्जेक्ट को परिभाषित करने के लिए, "threading.Barrier" का उपयोग किया जाता है।
threading.Barrier(parties, action=None, timeout=None)
जहां,
- parties = थ्रेड्स की संख्या
- action = जब वे जारी किए जाते हैं तो थ्रेड्स में से एक द्वारा कॉल किया जाता है।
- timeout = डिफ़ॉल्ट टाइमआउट मान। यदि wait() के लिए कोई टाइमआउट मान निर्दिष्ट नहीं है, तो इस टाइमआउट मान का उपयोग किया जाता है।
बैरियर क्लास द्वारा नीचे उल्लिखित विधियों का उपयोग किया जाता है।
| क्र.सं. | विधि और विवरण | |
|---|---|---|
| 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 # 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!