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函数缺省值与引用学习笔记分享
Feb 10 Python
python中List的sort方法指南
Sep 01 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
详解Python中的条件判断语句
May 14 Python
Python实现HTTP协议下的文件下载方法总结
Apr 20 Python
在win和Linux系统中python命令行运行的不同
Jul 03 Python
Python中你应该知道的一些内置函数
Mar 31 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
Python 文本文件内容批量抽取实例
Dec 10 Python
python将数组n等分的实例
Dec 02 Python
Python多线程thread及模块使用实例
Apr 28 Python
用python实现学生管理系统
Jul 24 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/25 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
js拼接html字符串的注意事项
2016/10/13 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
[00:34]DOTA2上海特级锦标赛 Spirit战队宣传片
2016/03/04 DOTA
python-str,list,set间的转换实例
2018/06/27 Python
python下载微信公众号相关文章
2019/02/26 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
Pytorch释放显存占用方式
2020/01/13 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
python3判断IP地址的方法
2021/03/04 Python
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
上课迟到检讨书
2014/02/19 职场文书
老公爱的承诺书
2014/03/31 职场文书
超市活动计划书
2014/04/24 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
2014年内勤工作总结
2014/11/24 职场文书
趵突泉导游词
2015/02/03 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
初级职称评定工作总结
2015/08/13 职场文书
文明上网主题班会
2015/08/14 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers
Python中itertools库的四个函数介绍
2022/04/06 Python