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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
python实现基本进制转换的方法
Jul 11 Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
python中set()函数简介及实例解析
Jan 09 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
python3 实现一行输入,空格隔开的示例
Nov 14 Python
python将list转为matrix的方法
Dec 12 Python
浅谈Python的条件判断语句if/else语句
Mar 21 Python
python自动循环定时开关机(非重启)测试
Aug 26 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
windows、linux下打包Python3程序详细方法
Mar 17 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
3款值得推荐的微信开发开源框架
2014/10/28 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
简单的自定义php模板引擎
2016/08/26 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
简述vue中的config配置
2018/01/23 Javascript
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
python冒泡排序算法的实现代码
2013/11/21 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
python实现维吉尼亚加密法
2019/03/20 Python
pandas参数设置的实用小技巧
2020/08/23 Python
python中time、datetime模块的使用
2020/12/14 Python
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
经济与贸易专业应届生求职信
2013/11/19 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
地球一小时倡议书
2014/04/15 职场文书
节约用水的口号
2014/06/20 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
晚会开场白和结束语
2015/05/29 职场文书
山楂树之恋观后感
2015/06/11 职场文书
高中历史教学反思
2016/02/19 职场文书
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers