Python:线程同步,Barrier屏障

本文介绍了Python3.2引入的新特性 Barrier,它如同路障或道闸,用于同步线程。当指定数量的线程到达屏障时,所有线程会一起继续执行。通过实例展示了 Barrier的使用,包括线程等待、超时情况及在并发初始化中的应用,例如在所有线程完成特定任务(如加载数据、检查)后才允许程序继续运行。若某个任务失败, Barrier会进入broken状态,导致所有线程收到异常并退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Barrier屏障

有人翻译成栅栏,建议还是使用屏障,可以想象成路障,道闸,Python3.2引入的新功能

名称 含义
Barrier(parties,action=None,timerout=None) 构建Barrier对象,指定参与方数目,timerout是wait方法未指定超时的默认值
n_waiting 当前在屏障中等待的线程数
parties 各方数,就是需要多少等待
wait(timerout=None) 等待通过屏障。返回0到线程数-1的整数,每个线程返回不同,如果wait方法设置了超时,并超时发送,屏障将处于broken状态

Barrier实例

import threading
import logging

#输出自定义
FORMAT = '%(asctime)s-15s\t [%(threadName)s,%(thread)8d] %(message)s'
logging.basicConfig(format=FORMAT,level=logging.INFO)

def worker(barrier:threading.Barrier):
    logging.info("waiting for {} threads".format(barrier.n_waiting))
    try:
        barrier_id = barrier.wait()
        logging.info("after barrier {}".format(barrier_id))
    except threading.BrokenBarrierError:
        logging.info("Broken Barrier")

barrier = threading.Barrier(3)
for x in range(3):
    threading.Thread(target=worker,name="worker-{}".format(x),args=(barrier,)).start()
logging.info("started")

结果:
2021-06-20 18:25:40,300-15s	 [worker-0,   13364] waiting for 0 threads
2021-06-20 18:25:40,301-15s	 [worker-1,   18264] waiting for 1 threads
2021-06-20 18:25:40,301-15s	 [wo
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值