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 08 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
Apr 01 Python
详解Python中的join()函数的用法
Apr 07 Python
Python中exit、return、sys.exit()等使用实例和区别
May 28 Python
Python+tkinter使用40行代码实现计算器功能
Jan 30 Python
Django压缩静态文件的实现方法详析
Aug 26 Python
linux中如何使用python3获取ip地址
Jul 15 Python
Python Django 前后端分离 API的方法
Aug 28 Python
Python2 与Python3的版本区别实例分析
Mar 30 Python
python变量的作用域是什么
May 26 Python
python 检测图片是否有马赛克
Dec 01 Python
教你如何用Python实现人脸识别(含源代码)
Jun 23 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目录导航文件代码
2006/10/09 PHP
PHP简介
2006/10/09 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
php伪静态之APACHE篇
2014/06/02 PHP
详解YII关联查询
2016/01/10 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
Python直接赋值及深浅拷贝原理详解
2020/09/05 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
初婚初育证明范本
2014/11/24 职场文书
五一劳动节活动总结
2015/02/09 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis