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编程中实现迭代器的一些技巧小结
Jun 21 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
Python验证文件是否可读写代码分享
Dec 11 Python
Python 元类实例解析
Apr 04 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
python如何写个俄罗斯方块
Nov 06 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
关于php 高并发解决的一点思路
2017/04/16 PHP
ECMAScript 创建自己的js类库
2012/11/22 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
Python装饰器decorator用法实例
2014/11/10 Python
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
班组长安全职责
2014/01/05 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
期末复习计划
2015/01/19 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
干部理论学习心得体会
2016/01/21 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
Python中的socket网络模块介绍
2022/07/23 Python
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript