Barrier จัดให้มีหนึ่งในเทคนิคการซิงโครไนซ์ python ซึ่งเธรดเดี่ยวหรือหลายเธรดรอจนกว่าจะถึงจุดในชุดของกิจกรรมและดำเนินการร่วมกัน
เพื่อกำหนดวัตถุกีดขวาง "เกลียว ใช้สิ่งกีดขวาง”
threading.Barrier(parties, action = None, timeout = None)
ที่ไหน
-
ฝ่าย =จำนวนกระทู้
-
action =เรียกโดยหนึ่งในเธรดเมื่อถูกปล่อย
-
หมดเวลา =ค่าการหมดเวลาเริ่มต้น ในกรณีที่ไม่ได้ระบุค่าการหมดเวลาสำหรับ wait() ค่าการหมดเวลานี้จะถูกนำมาใช้
เมธอดที่กล่าวถึงด้านล่างถูกใช้โดยคลาส Barrier
| Sr.No | วิธีการ &คำอธิบาย |
|---|---|
| 1 | ปาร์ตี้ ต้องใช้เธรดจำนวนหนึ่งเพื่อไปยังจุดกั้นทั่วไป |
| 2 | n_waiting จำนวนเธรดที่รออยู่ในจุดกั้นทั่วไป |
| 3 | เสีย ค่าบูลีน จริง- ถ้าสิ่งกีดขวางอยู่ในสถานะที่เสียหาย อย่างอื่น เป็นเท็จ |
| 4 | รอ ( หมดเวลา =ไม่มี) รอจนกว่าจะได้รับแจ้งหรือหมดเวลา หากเธรดการเรียกไม่ได้รับล็อกเมื่อเรียกเมธอดนี้ ข้อผิดพลาดรันไทม์จะปรากฏขึ้น เมธอดนี้ปล่อยการล็อกพื้นฐานแล้วบล็อกจนกว่าจะถูกปลุกขึ้นโดยการเรียกเมธอด notify() หรือ notify_all() สำหรับตัวแปรเงื่อนไขเดียวกันในเธรดอื่น หรือจนกว่าจะหมดเวลาซึ่งเป็นทางเลือก เมื่อปลุกหรือหมดเวลา มันจะรับล็อคใหม่และกลับมา เมื่อ หมดเวลา มีอาร์กิวเมนต์อยู่และไม่ใช่ ไม่มี ควรเป็นเลขทศนิยมที่ระบุการหมดเวลาสำหรับการดำเนินการเป็นวินาที (หรือเศษส่วนของตัวเลข) |
| 5 | รีเซ็ต() ตั้งค่าหรือคืนสิ่งกีดขวางเป็นสถานะเริ่มต้น เช่น สถานะว่างเปล่า และเธรดที่รอจะได้รับ BrokenBarrierError |
| 6 | ยกเลิก() สิ่งนี้จะทำให้สิ่งกีดขวางนั้นพังทลาย สิ่งนี้ทำให้เธรดที่ใช้งานอยู่ทั้งหมดหรือการเรียกรอ () ในอนาคตล้มเหลวด้วย 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!