Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

สิ่งกีดขวางใน Python


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!