python barrier_34.python 线程障碍对象Barrier
python线程Barrier俗称障碍对象,也称栅栏,也叫屏障。
一.线程障碍对象Barrier简介
1
2
3
4
5# 导入线程模块
importthreading
# 障碍对象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.案例一:常规使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46# !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:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
"""
# 导入线程模块
importthreading
defplyer_display():
print('初始化通过完成,音视频同步完成,可以开始播放....')
# 设置3个障碍对象
barrier=threading.Barrier(3,action=plyer_display,timeout=None)
defplayer_init(statu):
print(statu)
try:
# 设置超时时间,如果2秒内,没有达到障碍线程数量,
# 会进入断开状态,引发BrokenBarrierError错误
barrier.wait(2)
exceptExceptionase:# 断开状态,引发BrokenBarrierError错误
print("等待超时了... ")
else:
print("xxxyyyyxxxxxyyyyxxxyyyy")
if__name__=='__main__':
statu_list=["init ready","video ready","audio ready"]
thread_list=list()
foriinrange(0,3):
t=threading.Thread(target=player_init,args=(statu_list[i],))
t.start()
thread_list.append(t)
fortinthread_list:
t.join()
输出结果:1
2
3
4
5
6
7initready
videoready
audioready
初始化通过完成,音视频同步完成,可以开始播放....
xxxyyyyxxxxxyyyyxxxyyyy
xxxyyyyxxxxxyyyyxxxyyyy
xxxyyyyxxxxxyyyyxxxyyyy
注意:如果barrier.wait(timeout=None)等待超时,会进入断开状态,引发BrokenBarrierError错误,为了程序的健壮性,最好加上异常处理;
2.案例二:重置线程障碍数量reset()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41# 导入线程模块
importthreading
defplyer_display():
print('初始化通过完成,音视频同步完成,可以开始播放....')
# 设置3个障碍对象
barrier=threading.Barrier(3,action=plyer_display,timeout=None)
defplayer_init(statu):
whileTrue:
print(statu)
try:
# 设置超时时间,如果2秒内,没有达到障碍线程数量,
# 会进入断开状态,引发BrokenBarrierError错误
barrier.wait(2)
exceptExceptionase:# 断开状态,引发BrokenBarrierError错误
# print("断开状态... ")
continue
else:
print("xxxyyyxxxyyyxxxyyy")
break
if__name__=='__main__':
statu_list=["init ready","video ready","audio ready"]
thread_list=list()
foriinrange(0,3):
t=threading.Thread(target=player_init,args=(statu_list[i],))
t.start()
thread_list.append(t)
ifi==1:# 重置状态
print("动作片....")
barrier.reset()
fortinthread_list:
t.join()
输出结果:1
2
3
4
5
6
7
8
9
10initready
videoready
动作片....
initready
videoready
audioready
初始化通过完成,音视频同步完成,可以开始播放....
xxxyyyxxxyyyxxxyyy
xxxyyyxxxyyyxxxyyy
xxxyyyxxxyyyxxxyyy
注意:如果barrier.wait(timeout=None)等待超时,会进入断开状态,引发BrokenBarrierError错误,为了程序的健壮性,最好加上异常处理;
猜你喜欢:
python barrier_34.python 线程障碍对象Barrier相关推荐
- python barrier_Python线程障碍对象Barrier原理详解
python线程Barrier俗称障碍对象,也称栅栏,也叫屏障. 一.线程障碍对象Barrier简介 # 导入线程模块 import threading # 障碍对象barrier barrier = ...
- Python 线程障碍对象 Barrier - Python零基础入门教程
目录 一.Python 线程障碍对象 Barrier 简介 二.Python 线程障碍对象 Barrier 原理 三.Python 线程障碍对象 Barrier 函数介绍 四.Python 线程障碍对 ...
- Python之进程+线程+协程(同步对象、信号量、队列)
文章目录 Event同步对象 semaphore信号量 队列 本篇是关于Python进程方面的内容了,主要是Event同步对象,信号量和队列 Event同步对象 1.概念: 我们可以对一个线程set一 ...
- python多线程结束线程_Python多线程和Office第2部分
python多线程结束线程 This is the second and final part of the series. You can find the first part of the bl ...
- Python进程、线程、协程详解
进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...
- Python学习之==线程进程
一.什么是线程(thread) 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一个线程指的是进程中一个单一顺序的控制流,一个进程中可以包含多个线程,每条线程并行 ...
- python barrier_[Python 多线程] Barrier (十一)
Barrier 栅栏,也叫屏障.可以想象成路障.道闸. Python 3.2引入的新功能. 构造方法: threading.Barrier(parties, action=None, timeout= ...
- python进程和线程_Python进程与线程知识
好程序员Python 培训分享进程与线程知识 , Python 开发语言现在已经是被大家非常看中的编程语言了,本篇文章给读者们分享一下 Python 进程与线程知识小结,本篇文章具有一定的参考借鉴价值 ...
- Python中的线程间通信
Python中的线程间通信 文章目录 Python中的线程间通信 1.Queue 2.同步机制 1.Event 2.Semaphore(信号量) 3.Lock(锁) 4.RLock(可重入锁) 5.C ...
最新文章
- png库结合zlib库使用出现的一个链接问题的解决
- 企业:怎样的渗透测试频率是合适的?
- 整理一些提高C#编程性能的技巧
- python爬虫requests库_Python爬虫(三)Requests库
- LeetCode两数相除java
- full join 和full outer join_28.MySQL中的左(右)外连接 LEFT(RIGHT) [OUTER] JOIN
- 如何卸载mingw_minGW在windows安装 | 学步园
- git flow 分支合并
- 2020-05-22
- php-fpm 端口号,PHP-FPM 配置说明
- LCS (动态规划)
- html 拼图游戏,HTML5人物拼图游戏
- 017 大数定律(车比学夫、辛钦)及中心极限定理
- English trip 自习内容 英语时态
- Unsupported major.minor version 51.0解决
- 王者荣耀 服务器显示不出100区,王者荣耀为什么荣耀战区显示不出来
- Hilbert 曲线
- 打开计算机 访问不到d盘,教大家电脑找不到d盘的原因及解决办法
- jmeter中服务器名称IP,以及下面的路径填写
- 如何用计算机测摄像头信号,如何使用ping命令测试网络摄像头连通性?这篇文章告诉你...
热门文章
- MySQL BETWEEN 语法
- 业界最全,阿里云混合云灾备服务上线!
- 承包了我今日笑点的AI“文心一言”,被质疑是“套壳”?
- 使用HttpClient下载网页
- 打印机服务无法启动 错误代码1068
- photoshop学习之用钢笔工具抠图(循序渐进)
- QR码编码原理二(编码)
- 【北京站】技术沙龙第19期:千万日活量级 iOS 应用背后的技术
- 无手机号注册Outlook邮箱方法
- 如何使用netsh advfirewall firewall而不是netsh firewall控制Windows Server 2008的防火墙行为