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编写电话薄实现增删改查功能
May 07 Python
关于Python 3中print函数的换行详解
Aug 08 Python
简单谈谈python中的语句和语法
Aug 10 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
python+opencv实现霍夫变换检测直线
Oct 23 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
python绘制玫瑰的实现代码
Mar 02 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 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
11个PHP 分页脚本推荐
2011/08/15 PHP
解析wamp5下虚拟机配置文档
2013/06/27 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
十个Python程序员易犯的错误
2015/12/15 Python
python中的decorator的作用详解
2018/07/26 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
秘书专业自荐信范文
2013/12/26 职场文书
欢度春节标语
2014/07/01 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
放弃继承权公证书
2015/01/23 职场文书
2019年教师入党申请书
2019/06/27 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang