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相关推荐

  1. python barrier_Python线程障碍对象Barrier原理详解

    python线程Barrier俗称障碍对象,也称栅栏,也叫屏障. 一.线程障碍对象Barrier简介 # 导入线程模块 import threading # 障碍对象barrier barrier = ...

  2. Python 线程障碍对象 Barrier - Python零基础入门教程

    目录 一.Python 线程障碍对象 Barrier 简介 二.Python 线程障碍对象 Barrier 原理 三.Python 线程障碍对象 Barrier 函数介绍 四.Python 线程障碍对 ...

  3. Python之进程+线程+协程(同步对象、信号量、队列)

    文章目录 Event同步对象 semaphore信号量 队列 本篇是关于Python进程方面的内容了,主要是Event同步对象,信号量和队列 Event同步对象 1.概念: 我们可以对一个线程set一 ...

  4. python多线程结束线程_Python多线程和Office第2部分

    python多线程结束线程 This is the second and final part of the series. You can find the first part of the bl ...

  5. Python进程、线程、协程详解

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  6. Python学习之==线程进程

    一.什么是线程(thread) 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一个线程指的是进程中一个单一顺序的控制流,一个进程中可以包含多个线程,每条线程并行 ...

  7. python barrier_[Python 多线程] Barrier (十一)

    Barrier 栅栏,也叫屏障.可以想象成路障.道闸. Python 3.2引入的新功能. 构造方法: threading.Barrier(parties, action=None, timeout= ...

  8. python进程和线程_Python进程与线程知识

    好程序员Python 培训分享进程与线程知识 , Python 开发语言现在已经是被大家非常看中的编程语言了,本篇文章给读者们分享一下 Python 进程与线程知识小结,本篇文章具有一定的参考借鉴价值 ...

  9. Python中的线程间通信

    Python中的线程间通信 文章目录 Python中的线程间通信 1.Queue 2.同步机制 1.Event 2.Semaphore(信号量) 3.Lock(锁) 4.RLock(可重入锁) 5.C ...

最新文章

  1. png库结合zlib库使用出现的一个链接问题的解决
  2. 企业:怎样的渗透测试频率是合适的?
  3. 整理一些提高C#编程性能的技巧
  4. python爬虫requests库_Python爬虫(三)Requests库
  5. LeetCode两数相除java
  6. full join 和full outer join_28.MySQL中的左(右)外连接 LEFT(RIGHT) [OUTER] JOIN
  7. 如何卸载mingw_minGW在windows安装 | 学步园
  8. git flow 分支合并
  9. 2020-05-22
  10. php-fpm 端口号,PHP-FPM 配置说明
  11. LCS (动态规划)
  12. html 拼图游戏,HTML5人物拼图游戏
  13. 017 大数定律(车比学夫、辛钦)及中心极限定理
  14. English trip 自习内容 英语时态
  15. Unsupported major.minor version 51.0解决
  16. 王者荣耀 服务器显示不出100区,王者荣耀为什么荣耀战区显示不出来
  17. Hilbert 曲线
  18. 打开计算机 访问不到d盘,教大家电脑找不到d盘的原因及解决办法
  19. jmeter中服务器名称IP,以及下面的路径填写
  20. 如何用计算机测摄像头信号,如何使用ping命令测试网络摄像头连通性?这篇文章告诉你...

热门文章

  1. MySQL BETWEEN 语法
  2. 业界最全,阿里云混合云灾备服务上线!
  3. 承包了我今日笑点的AI“文心一言”,被质疑是“套壳”?
  4. 使用HttpClient下载网页
  5. 打印机服务无法启动 错误代码1068
  6. photoshop学习之用钢笔工具抠图(循序渐进)
  7. QR码编码原理二(编码)
  8. 【北京站】技术沙龙第19期:千万日活量级 iOS 应用背后的技术
  9. 无手机号注册Outlook邮箱方法
  10. 如何使用netsh advfirewall firewall而不是netsh firewall控制Windows Server 2008的防火墙行为