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

ออบเจกต์ Barrier ใน Python

Barrier ให้เทคนิคซิงโครไนซ์ชันของ Python หนึ่งแบบ ที่เธรดเดี่ยวหรือหลายเธรดรอจนถึงจุดหนึ่งในชุดกิจกรรม และก้าวหน้าพร้อมกัน

เพื่อกำหนดออบเจกต์ Barrier ใช้ "threading.Barrier"

threading.Barrier(parties, action=None, timeout=None)

ที่:

  • parties = จำนวนเธรด
  • action = เรียกโดยหนึ่งในเธรดเมื่อพวกเขาถูกปล่อย
  • timeout = ค่า timeout เริ่มต้น หากไม่มีค่า timeout ระบุสำหรับ wait() ค่านี้จะถูกใช้

เมธอดต่อไปนี้ถูกใช้โดยคลาส Barrier:

Sr.NoMethod & Description
1parties
จำนวนเธรดที่ต้องถึงจุด Barrier ร่วมกัน
2n_waiting
จำนวนเธรดที่รออยู่ที่จุด Barrier ร่วมกัน
3brokenค่าบูลีน True - หาก Barrier อยู่ในสถานะ broken มิฉะนั้น False
4wait(timeout=None)
รอจนกว่าจะได้รับการแจ้งเตือนหรือเกิด timeout หากเธรดที่เรียกไม่ได้รับล็อคเมื่อเรียกเมธอดนี้ จะเกิด runtime error
เมธอดนี้ปลดล็อคพื้นฐานและบล็อกจนกว่าจะถูกปลุกโดย notify() หรือ notify_all() สำหรับตัวแปรเงื่อนไขเดียวกันในเธรดอื่น หรือจนกว่าจะเกิด timeout ทางเลือก เมื่อปลุกหรือ timeout แล้ว จะได้ล็อคคืนและคืนค่า
เมื่ออาร์กิวเมนต์ timeout อยู่และไม่ใช่ None ควรเป็นเลขทศนิยมระบุ timeout สำหรับการดำเนินการในวินาที (หรือเศษส่วน)
5reset()
ตั้งค่าหรือคืนค่า Barrier ไปสู่สถานะเริ่มต้น คือ สถานะว่าง เธรดที่รออยู่จะได้รับ BrokenBarrierError
6abort()
จะทำให้ 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!