python中的Barrier对象用于等待固定数量的线程完成执行,然后任何特定线程才能继续执行程序。每个线程在到达Barrier时都调用wait()函数。Barrier负责跟踪wait()调用的数量。如果该数目超出了为其初始化Barrier的线程数,则Barrier为等待线程提供了一种继续执行的方法。同时释放执行时的所有线程。
Barriers甚至可以用来同步线程之间的访问。 但是,通常使用Barriers来组合线程的输出。Barriers对象可以针对最初为其初始化的完全相同的线程数重复使用。
初始化barrier
可以使用threading.Barrier类初始化barrier,如下面的程序所示。括号内的数字表示barrier应等待的线程数。
语法:
barrier = threading.Barrier(number_of_threads, action = None, timeout = None)
为number_of_threads创建一个barrier对象。如果提供了操作,则该操作是可调用的,可在线程释放时由其中一个线程调用。如果没有为wait()方法指定超时,则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) + "") barrier.wait() thread1 = thread(100) thread2 = thread(101) thread1.start() thread2.start() barrier.wait() print("Exit")
输出:
100101Exit
与threading.Barrier类相关的一些常见函数调用为:
1)检查barrier的状态:
broken:如果障碍处于broken状态,则为True的布尔值。
语法:
barrier.broken
2)parties:穿过barrier所需的线程数。
语法:
barrier.parties
3)中止barrier:
abort:将barrier置于broken状态。这会导致任何对wait()的活动调用或将来的调用都失败,并出现BrokenBarrierError。
在程序执行过程中,经常需要通过对barrier进行中止功能调用来跳过死锁的条件。
语法:
barrier.abort()
4)重置barrier:
reset:将barrier 返回到默认的空状态。任何等待它的线程将收到BrokenBarrierError异常。
语法:
barrier.reset()
5)wait:通过障碍。当barrier的所有线程都调用了此函数后,它们将同时释放。如果提供了超时,则它优先于提供给类构造函数的任何超时使用。
返回值是一个整数,范围为0到parties–1,每个线程不同。如果呼叫超时,barrier将进入断开状态。如果在线程等待时barrier已断开或重置,此方法可能会引发BrokenBarrierError异常。
语法:
barrier.wait(timeout = None)
6)n_waiting:barrier中当前正在等待的线程数。
语法:
barrier.n_waiting
通常,当barrier对象被重置或分解时,会引发BrokenBarrierError异常。
这是一个示例程序,展示了如何在python中使用barrier
# 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) + "") print("Parties = " + str(barrier.parties) + "") print("n_waiting = " + str(barrier.n_waiting) + "") barrier.wait() thread1 = thread(100) thread2 = thread(101) thread1.start() thread2.start() barrier.wait() print(str(barrier.broken) + "") barrier.reset() print("n_waiting after reset = " + str(barrier.n_waiting)) barrier.abort() print("End")
输出:
100101Parties = 3Parties = 3n_waiting = 1n_waiting = 1Falsen_waiting after reset = 0End