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使用sorted排序的方法小结
Jul 28 Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 Python
scrapy spider的几种爬取方式实例代码
Jan 25 Python
Python实现二维数组输出为图片
Apr 03 Python
python Pandas 读取txt表格的实例
Apr 29 Python
基于Python的PIL库学习详解
May 10 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
Numpy之reshape()使用详解
Dec 26 Python
python如何对链表操作
Oct 10 Python
python中四舍五入的正确打开方式
Jan 18 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数据库配置文件一般做法分享
2012/07/07 PHP
php读取mysql的简单实例
2014/01/15 PHP
php批量删除操作代码分享
2017/02/26 PHP
javascript 写类方式之七
2009/07/05 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
vue如何截取字符串
2019/05/06 Javascript
使用python存储网页上的图片实例
2018/05/22 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
python基于event实现线程间通信控制
2020/01/13 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
树莓派升级python的具体步骤
2020/07/05 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
联想C++笔试题
2012/06/13 面试题
大学四年学习的自我评价分享
2013/12/09 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
员工规章制度范本
2015/08/07 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
python代码实现备忘录案例讲解
2021/07/26 Python
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python