Barrier ให้เทคนิคซิงโครไนซ์ชันของ Python หนึ่งแบบ ที่เธรดเดี่ยวหรือหลายเธรดรอจนถึงจุดหนึ่งในชุดกิจกรรม และก้าวหน้าพร้อมกัน
เพื่อกำหนดออบเจกต์ Barrier ใช้ "threading.Barrier"
threading.Barrier(parties, action=None, timeout=None)
ที่:
- parties = จำนวนเธรด
- action = เรียกโดยหนึ่งในเธรดเมื่อพวกเขาถูกปล่อย
- timeout = ค่า timeout เริ่มต้น หากไม่มีค่า timeout ระบุสำหรับ wait() ค่านี้จะถูกใช้
เมธอดต่อไปนี้ถูกใช้โดยคลาส Barrier:
| Sr.No | Method & Description | |
|---|---|---|
| 1 | parties จำนวนเธรดที่ต้องถึงจุด Barrier ร่วมกัน | |
| 2 | n_waiting จำนวนเธรดที่รออยู่ที่จุด Barrier ร่วมกัน | |
| 3 | broken | ค่าบูลีน True - หาก Barrier อยู่ในสถานะ broken มิฉะนั้น False |
| 4 | wait(timeout=None) รอจนกว่าจะได้รับการแจ้งเตือนหรือเกิด timeout หากเธรดที่เรียกไม่ได้รับล็อคเมื่อเรียกเมธอดนี้ จะเกิด runtime error เมธอดนี้ปลดล็อคพื้นฐานและบล็อกจนกว่าจะถูกปลุกโดย notify() หรือ notify_all() สำหรับตัวแปรเงื่อนไขเดียวกันในเธรดอื่น หรือจนกว่าจะเกิด timeout ทางเลือก เมื่อปลุกหรือ timeout แล้ว จะได้ล็อคคืนและคืนค่า เมื่ออาร์กิวเมนต์ timeout อยู่และไม่ใช่ None ควรเป็นเลขทศนิยมระบุ timeout สำหรับการดำเนินการในวินาที (หรือเศษส่วน) | |
| 5 | reset() ตั้งค่าหรือคืนค่า Barrier ไปสู่สถานะเริ่มต้น คือ สถานะว่าง เธรดที่รออยู่จะได้รับ BrokenBarrierError | |
| 6 | abort() จะทำให้ Barrier อยู่ในสถานะ broken นี้ทำให้เธรดที่ทำงานอยู่ทั้งหมดหรือการเรียก wait() ในอนาคตล้มเหลวพร้อม BrokenBarrierError |
barrierThread.py
from random import randrange
from threading import Barrier, Thread
from time import ctime, sleep
num = 4 # 4 threads will need to pass this barrier to get released.
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()
""" Below loop enables waiting for the threads to complete before moving on with the main script. """
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!