Python中的屏障对象

屏障提供了一种python同步技术,通过该技术,单个或多个线程可以等到一组活动中的某个点并一起取得进展。

要定义屏障对象,“线程。使用屏障”。

threading.Barrier(parties, action = None, timeout = None)

哪里,

  • 双方=线程数

  • action =线程释放时由其中一个线程调用。

  • 超时=默认超时值。如果未为指定wait()超时值,则使用该超时值。

屏障类使用以下提到的方法。

序号方法与说明
1各方
达到公共障碍点所需的多个线程。
2n_waiting
在公共屏障点中等待的线程数
3
一个布尔值,真阳性如果阻挡处于破碎状态别的假。
4wait(timeout = None)
等待通知或发生超时。如果在调用此方法时调用线程未获取锁,则会引发运行时错误。
此方法释放基础锁,然后阻塞,直到被notify()另一个线程中的相同条件变量的或notify_all()方法调用唤醒或直到发生可选的超时为止。一旦唤醒或超时,它将重新获取锁并返回。
当存在timeout参数而不是None时,它应该是一个浮点数,以秒为单位(或其分数)指定操作的超时时间。
5reset()
将屏障设置为默认状态,即为空状态。等待它的线程将收到BrokenBarrierError。
6Abort()
这将使屏障进入破坏状态。这会导致所有活动线程或任何将来的调用wait()失败,并出现BrokenBarrierError。

barrierThread.py

from random import randrange
from threading import Barrier, Thread
from time import ctime, sleep
num = 4
# 4 threads will need to pass this barrier to get released.
b = Barrier(num)
names = ['India', 'Japan', 'USA', 'China']
def player():
   name = names.pop()
   sleep(randrange(2, 5))
   print('%s reached the barrier at: %s \n' % (name, ctime()))
   b.wait()
threads = []
print("Race starts now…")
for i in range(num):
   threads.append(Thread(target=player))
   threads[-1].start()
"""
Below loop enables waiting for the threads to complete before moving on with the main script.
"""
for thread in threads:
   thread.join()
print("所有到达的障碍点!")

结果

Race starts now…
India reached the barrier at: Fri Jan 18 14:07:44 2019
China reached the barrier at: Fri Jan 18 14:07:44 2019
Japan reached the barrier at: Fri Jan 18 14:07:46 2019
USA reached the barrier at: Fri Jan 18 14:07:46 2019
所有到达的障碍点!