Python 中的 Barrier 对象

2024 年 8 月 29 日 | 阅读 3 分钟

Barrier 对象允许一组线程互相等待,然后再继续执行。这对于需要按特定顺序执行的任务,或者需要同步以避免竞争条件的任务非常有用。

这些对象用于同步线程的执行。当一个线程在一个 barrier 对象上调用 wait() 方法时,它会阻塞,直到指定数量的线程也调用了同一个 barrier 对象上的 wait() 方法。一旦指定数量的线程调用了 wait(),所有线程都会被释放,并可以继续执行。

初始化 Barrier

使用 threading 来初始化 barrier。下面是语法。

语法 -

number_of_threads 是 barrier 应该等待的线程数。action 是当线程被释放时,由其中一个线程调用的可调用对象。timeout 是 wait() 方法如果没有指定超时值的默认超时值。

示例 -

输出

200
201
Exit

以下是一些与 barrier 线程相关的函数。

1. 检查 barrier 的状态 - broker 用于检查 barrier 的状态。语法如下。

2. parties - 通过 barrier 所需的线程数。

3. 中止 barrier - abort() 用于中止 barrier。将 barrier 置于损坏状态。为了防止程序执行死锁,当遇到 barrier 时,通常需要包含 abort 函数调用。

语法 -

4. 重置 barrier - 通过将 barrier 重置为其默认的空状态,任何正在等待它的线程都将通过 BrokenBarrierError 异常收到通知。

语法 -

5. wait - 当所有参与 barrier 的线程都调用了 wait() 函数后,它们都会同时被释放。换句话说,如果你在调用 wait() 方法时指定了超时值,那么即使在构造函数中指定了不同的超时值,也会使用这个超时值。这允许你在必要时覆盖超时值。换句话说,wait() 方法返回一个对每个线程来说都是唯一的整数。这个整数可以用来识别是哪个线程最后调用了 wait() 方法。如果调用超时,barrier 将被置于损坏状态。这意味着 barrier 将不再正常工作。如果 barrier 在线程等待时被损坏或重置,wait() 方法也可能引发 BrokenBarrierError 异常。如果 barrier 在仍有线程等待时被重置或释放,则 barrier 被损坏。

语法 -

6. n_waiting - 显示当前在 barrier 中等待的线程数。

语法

让我们理解下面的例子。

示例 -

输出

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