Python线程障碍对象Barrier原理详解


Posted in Python onDecember 02, 2019

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

一.线程障碍对象Barrier简介

# 导入线程模块
import threading
# 障碍对象barrier
barrier = threading.Barrier(parties, action=None, timeout=None)

parties — 线程计数器,记录线程数量,也称线程障碍数量;

action — 是一个可调用函数,当等待的线程到达了线程障碍数量parties,其中一个线程会首先调用action 对应函数,之后再执行线程自己内部的代码;

timeout — 默认的超时时间;

二.线程障碍对象Barrier原理

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

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

三.多线程障碍对象Barrier相关函数介绍

wait(timeout=None) — 阻塞并尝试通过障碍,如果等待的线程数量大于或者等于线程障碍数量parties,则表示障碍通过,执行action 对应函数并执行线程内部代码,反之则继续等待;如果wait(timeout=None) 等待超时,障碍将进入断开状态!如果在线程等待期间障碍断开或重置,此方法会引发BrokenBarrierError错误,注意添加异常处理,演示代码查看案例一;

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

四.线程障碍对象Barrier使用

1.案例一:常规使用

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解忧
@Blog(个人博客地址): shuopython.com
@WeChat Official Account(微信公众号):猿说python
@Github:www.github.com
 
@File:python_arbrier.py
@Time:2019/10/31 21:25
 
@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()

# 导入线程模块
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错误,为了程序的健壮性,最好加上异常处理;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python压缩和解压缩zip文件
Feb 14 Python
python中split方法用法分析
Apr 17 Python
使用Python的turtle模块画图的方法
Nov 15 Python
numpy排序与集合运算用法示例
Dec 15 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
python cv2在验证码识别中应用实例解析
Dec 25 Python
python默认参数调用方法解析
Feb 09 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
基于Python快速处理PDF表格数据
Jun 03 Python
Python如何使用神经网络进行简单文本分类
Feb 25 Python
python 如何执行控制台命令与操作剪切板
May 20 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 Python
python 循环数据赋值实例
Dec 02 #Python
python创建n行m列数组示例
Dec 02 #Python
python 创建一维的0向量实例
Dec 02 #Python
python 初始化一个定长的数组实例
Dec 02 #Python
Python生态圈图像格式转换问题(推荐)
Dec 02 #Python
python 申请内存空间,用于创建多维数组的实例
Dec 02 #Python
python将数组n等分的实例
Dec 02 #Python
You might like
十天学会php(1)
2006/10/09 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
Javascript Objects详解
2014/09/04 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
Python获取远程文件大小的函数代码分享
2014/05/13 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
初中科学教学反思
2014/01/21 职场文书
鲜花方阵解说词
2014/02/13 职场文书
多媒体专业自我鉴定
2014/02/28 职场文书
化学工程专业求职信
2014/08/10 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
三潭印月的导游词
2015/02/12 职场文书
婚育证明格式
2015/06/17 职场文书
运动会5000米加油稿
2015/07/21 职场文书
Python实现天气查询软件
2021/06/07 Python