📜  Python中的屏障对象

📅  最后修改于: 2022-05-13 01:55:39.138000             🧑  作者: Mango

Python中的屏障对象

Python中的屏障对象用于等待固定数量的线程完成执行,然后任何特定线程才能继续执行程序。每个线程在到达屏障时调用 wait()函数。屏障负责跟踪 wait() 调用的数量。如果这个数字超过了初始化屏障的线程数,那么屏障就会让等待线程继续执行。在这个执行点的所有线程,同时被释放。

甚至可以使用屏障来同步线程之间的访问。但是,通常使用屏障来组合线程的输出。一个屏障对象可以被多次重用,线程数与最初初始化的线程数完全相同。

初始化屏障

可以使用 threading.Barrier 类初始化屏障,如下面的程序所示。括号内的数字表示屏障应等待的线程数。

句法:

barrier = threading.Barrier(number_of_threads, action = None, timeout = None)

为 number_of_threads 创建一个屏障对象。提供的操作是可调用的,可在其中一个线程被释放时调用。如果没有为 wait() 方法指定 timeout,则 timeout 是默认的超时值。

import threading
  
barrier = threading.Barrier(3)
  
class thread(threading.Thread):
    def __init__(self, thread_ID):
        threading.Thread.__init__(self)
        self.thread_ID = thread_ID
    def run(self):
        print(str(self.thread_ID) + "\n")
        barrier.wait()
          
thread1 = thread(100)
thread2 = thread(101)
  
thread1.start()
thread2.start()
barrier.wait()
  
print("Exit\n")

输出:

100
101
Exit

与 threading.Barrier 类相关的一些常见函数调用有:

  1. 检查屏障的状态:
    broken:如果屏障处于损坏状态,则为 True 的布尔值。
    句法:
    barrier.broken

  2. 各方:通过障碍所需的线程数。
    句法:
    barrier.parties
  3. 中止屏障:
    abort:使屏障进入破坏状态。这会导致对 wait() 的任何活动或未来调用失败并出现 BrokenBarrierError

    通常需要在屏障上中止函数调用以跳过程序执行期间的死锁条件。
    句法:

    barrier.abort()
  4. 重置屏障:
    重置:将屏障返回到默认的空状态。任何等待它的线程都会收到 BrokenBarrierError 异常。

    句法:

    barrier.reset()
  5. 等待:通过障碍。当屏障的所有线程都调用了这个函数时,它们都被同时释放。如果提供了超时,则优先使用它而不是提供给类构造函数的任何超时。

    返回值是一个整数,范围为 0 到party – 1,每个线程都不同。如果调用超时,屏障将进入破坏状态。如果在线程等待时屏障被破坏或重置,此方法可能会引发 BrokenBarrierError 异常。

    句法:

    barrier.wait(timeout = None)
  6. n_waiting :当前在屏障中等待的线程数。
    句法:
    barrier.n_waiting

通常,当屏障对象被重置或分解时,会引发 BrokenBarrierError 异常。

这是一个示例程序来显示如何在Python中使用障碍

# program to demonstrate
# barriers in python
  
import threading
  
barrier = threading.Barrier(3)
  
class thread(threading.Thread):
    def __init__(self, thread_ID):
        threading.Thread.__init__(self)
        self.thread_ID = thread_ID
    def run(self):
        print(str(self.thread_ID) + "\n")
        print("Parties = " + str(barrier.parties) + "\n")
        print("n_waiting = " + str(barrier.n_waiting) + "\n")
        barrier.wait()
          
thread1 = thread(100)
thread2 = thread(101)
  
thread1.start()
thread2.start()
  
barrier.wait()
  
print(str(barrier.broken) + "\n")
barrier.reset()
print("n_waiting after reset = " + str(barrier.n_waiting))
barrier.abort()
print("End")

输出:

100
101
Parties = 3
Parties = 3
n_waiting = 1
n_waiting = 1
False
n_waiting after reset = 0
End