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 类相关的一些常见函数调用有:
- 检查屏障的状态:
broken:如果屏障处于损坏状态,则为 True 的布尔值。
句法:barrier.broken
- 各方:通过障碍所需的线程数。
句法:barrier.parties
- 中止屏障:
abort:使屏障进入破坏状态。这会导致对 wait() 的任何活动或未来调用失败并出现 BrokenBarrierError通常需要在屏障上中止函数调用以跳过程序执行期间的死锁条件。
句法:barrier.abort()
- 重置屏障:
重置:将屏障返回到默认的空状态。任何等待它的线程都会收到 BrokenBarrierError 异常。句法:
barrier.reset()
- 等待:通过障碍。当屏障的所有线程都调用了这个函数时,它们都被同时释放。如果提供了超时,则优先使用它而不是提供给类构造函数的任何超时。
返回值是一个整数,范围为 0 到party – 1,每个线程都不同。如果调用超时,屏障将进入破坏状态。如果在线程等待时屏障被破坏或重置,此方法可能会引发 BrokenBarrierError 异常。
句法:
barrier.wait(timeout = None)
- 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