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