Python 线程障碍对象 Barrier - Python零基础入门教程

目录

零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门

Python 线程 Barrier 俗称障碍对象,也称栅栏,也叫屏障。​

一.Python 线程障碍对象 Barrier 简介

# 导入线程模块
import threading


'''
参数介绍:
    parties — 线程计数器,记录线程数量,也称线程障碍数量;
    action — 是一个可调用函数,当等待的线程到达了线程障碍数量parties,其中一个线程会首先调用action 对应函数,之后再执行线程自己内部的代码;
    timeout — 默认的超时时间;
'''

# 障碍对象barrier
barrier = threading.Barrier(parties, action=None, timeout=None)

二.Python 线程障碍对象 Barrier 原理

与之前介绍 互斥锁 Lock / 事件 Event / 定时器 Timer 等不同,多线程 Barrier 会设置一个线程障碍数量 parties ,如果等待的线程数量没有达到障碍数量 parties ,所有线程会处于阻塞状态,当等待的线程到达了这个数量就会唤醒所有的等待线程。

可能说的有点抽象,以播放器为例子:首先一个线程做播放器初始化工作(加载本地文件或者获取播放地址),然后一个线程获取视频画面,一个线程获取视频声音,只有当初始化工作完毕,视频画面获取完毕,视频声音获取完毕,播放器才会开始播放,其中任意一个线程没有完成,播放器会处于阻塞状态直到三个任务都完成!

三.Python 线程障碍对象 Barrier 函数介绍

wait(timeout=None) 阻塞并尝试通过障碍,如果等待的线程数量大于或者等于线程障碍数量 parties ,则表示障碍通过,执行 action 对应函数并执行线程内部代码,反之则继续等待;

如果 wait(timeout=None) 等待超时,障碍将进入断开状态!如果在线程等待期间障碍断开或重置,此方法会引发 BrokenBarrierError 错误,注意添加异常处理,演示代码查看案例一;

reset 重置线程障碍数量,返回默认的空状态,即当前阻塞的线程重新来过,如果在线程等待期间障碍断开或重置,此方法会引发 BrokenBarrierError 错误,注意添加异常处理,演示代码查看案例二;

四.Python 线程障碍对象 Barrier 使用

1.案例一:常规使用

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程障碍对象 Barrier.py
@Time:2021/05/04 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

"""

# 导入线程模块
import threading

def plyer_display():
    print('初始化通过完成,音视频同步完成,可以开始播放....')

# 设置3个障碍对象
barrier = threading.Barrier(3, action=plyer_display, timeout=None)


def player_init(statu):
    print(statu)
    try:
        # 设置超时时间,如果2秒内,没有达到障碍线程数量,
        # 会进入断开状态,引发BrokenBarrierError错误
        barrier.wait(2)
    except Exception as e: # 断开状态,引发BrokenBarrierError错误
        print("等待超时了... ")
    else:
        print("xxxooooxxxxxooooxxxoooo")

if __name__ == '__main__':

    statu_list = ["init ready","video ready","audio ready"]
    thread_list = list()
    for i in range(0,3):
        t = threading.Thread(target=player_init,args=(statu_list[i],))
        t.start()
        thread_list.append(t)

    for t in thread_list:
        t.join()


'''
输出结果:

init ready
video ready
audio ready
初始化通过完成,音视频同步完成,可以开始播放....
xxxooooxxxxxooooxxxoooo
xxxooooxxxxxooooxxxoooo
xxxooooxxxxxooooxxxoooo

'''

注意:如果 barrier.wait(timeout=None) 等待超时,会进入断开状态,引发 BrokenBarrierError 错误,为了程序的健壮性,最好加上异常处理;

2.案例二:重置线程障碍数量 reset

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程障碍对象 Barrier.py
@Time:2021/05/04 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

"""

# 导入线程模块
import threading

def plyer_display():
    print('初始化通过完成,音视频同步完成,可以开始播放....')

# 设置3个障碍对象
barrier = threading.Barrier(3, action=plyer_display, timeout=None)


def player_init(statu):

    while True:
        print(statu)
        try:
            # 设置超时时间,如果2秒内,没有达到障碍线程数量,
            # 会进入断开状态,引发BrokenBarrierError错误
            barrier.wait(2)
        except Exception as e: # 断开状态,引发BrokenBarrierError错误
            # print("断开状态... ")
            continue
        else:
            print("xxxooyyyxxxooyyyxxxooyyy")
            break

if __name__ == '__main__':

    statu_list = ["init ready","video ready","audio ready"]
    thread_list = list()
    for i in range(0,3):
        t = threading.Thread(target=player_init,args=(statu_list[i],))
        t.start()

        thread_list.append(t)
        if i == 1: # 重置状态
            print("不想看爱情片,我要看爱情动作片....")
            barrier.reset()


    for t in thread_list:
        t.join()

'''
输出结果:

init ready
video ready
不想看爱情片,我要看爱情动作片....
init ready
video ready
audio ready
初始化通过完成,音视频同步完成,可以开始播放....
xxxooyyyxxxooyyyxxxooyyy
xxxooyyyxxxooyyyxxxooyyy
xxxooyyyxxxooyyyxxxooyyy

'''

注意:如果 barrier.wait(timeout=None) 等待超时,会进入断开状态,引发 BrokenBarrierError 错误,为了程序的健壮性,最好加上异常处理;

五.猜你喜欢

  1. Python 条件推导式
  2. Python 列表推导式
  3. Python 字典推导式
  4. Python 不定长参数 *argc/**kargcs
  5. Python 匿名函数 lambda
  6. Python return 逻辑判断表达式
  7. Python is 和 == 区别
  8. Python 可变数据类型和不可变数据类型
  9. Python 浅拷贝和深拷贝
  10. Python 异常处理
  11. Python 线程创建和传参
  12. Python 线程互斥锁 Lock
  13. Python 线程时间 Event
  14. Python 线程条件变量 Condition
  15. Python 线程定时器 Timer
  16. Python 线程信号量 Semaphore
  17. Python 线程障碍对象 Barrier
  18. Python 线程队列 Queue – FIFO
  19. Python 线程队列 LifoQueue – LIFO
  20. Python 线程优先队列 PriorityQueue
  21. Python 线程池 ThreadPoolExecutor(一)
  22. Python 线程池 ThreadPoolExecutor(二)
  23. Python 进程 Process 模块
  24. Python 进程 Process 与线程 threading 区别
  25. Python 进程间通信 Queue / Pipe
  26. Python 进程池 multiprocessing.Pool
  27. Python GIL 锁

未经允许不得转载:猿说编程 » Python 线程障碍对象 Barrier

本文由博客 - 猿说编程 猿说编程 发布!

posted @ 2021-06-26 10:10  猿说编程  阅读(276)  评论(0编辑  收藏  举报