📜  Python中的屏障对象Barrier Objects

📅  最后修改于: 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类相关的一些常见函数调用为:

  1. 检查屏障的状态:
    断开:如果屏障处于断开状态,则为True的布尔值。
    语法:
    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