线程同步之Barrier


01.栅栏(barrier)是python3.2引入的新功能,其会阻塞指定个数的线程,直到满足个数阈值后一起释放,其构建方式为:

  • Barrier(parties, action=None, timeout=None)
  • Barrier类的参数包括:
    • parties,参与方,即等待的线程的个数。
    • action,满足线程个数后,线程被释放之前先调用的方法,之后再跑线程的内容。
    • timeout,等待线程个数的超时时间,默认为永久等待。
  • Barrier类的方法包括:
    • wait(),等待线程,使用wait()方法后线程将被阻塞,直到满足线程个数。
      • 如果超时或者执行action方法的时候报错,则进入断开状态。
      • wait()方法可以使用timeout参数,其作用同Barrier类中的timeout参数。
    • abort(),主动断开,会导致之前的wait()和之后的wait()都抛出BrokenBarrierError异常。
    • reset(),处于断开时,重置为默认的起始状态。
  • Barrier类的属性包括:
    • partier,参与方的个数。
    • n_waiting,当前等待的线程个数。
    • broken,当前是否处于断开状态,是返回True,否则返回False。
  • Barrier类的示例:
import threading
import logging
import time


FORMAT = "%(asctime)s %(threadName)s %(message)s"
logging.basicConfig(format=FORMAT, level=logging.INFO)

# 设置栅栏,当子线程数为3
barrier = threading.Barrier(parties=3)


def work(barrier):
    try:
        # 输出等待栅栏放行的线程个数
        logging.info("I am working~~, waiting is {}".format(barrier.n_waiting))
        # 开启wait()后,后续的代码需要等待满足3个子线程时才会一起执行
        barrier.wait()
    except threading.BrokenBarrierError:
        logging.info("Broken~~")
    logging.info("I finish, waiting is {}".format(barrier.n_waiting))


for i in range(3):
    time.sleep(1)
    t = threading.Thread(name='work_{}'.format(i), target=work, args=(barrier,),)
    t.start()
文档更新时间: 2021-10-04 00:19   作者:闻骏