python线程Barrier俗称障碍对象,也称栅栏,也叫屏障。

一.线程障碍对象Barrier简介

  1. # 导入线程模块
  2. import threading
  3.  
  4. # 障碍对象barrier
  5. 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. # !usr/bin/env python
  2. # -*- coding:utf-8 _*-
  3. """
  4. @Author:何以解忧
  5. @Blog(个人博客地址): shuopython.com
  6. @WeChat Official Account(微信公众号):猿说python
  7. @Github:www.github.com
  8.  
  9. @File:python_arbrier.py
  10. @Time:2019/10/31 21:25
  11.  
  12. @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  13. """
  14.  
  15. # 导入线程模块
  16. import threading
  17.  
  18. def plyer_display():
  19. print('初始化通过完成,音视频同步完成,可以开始播放....')
  20.  
  21. # 设置3个障碍对象
  22. barrier = threading.Barrier(3, action=plyer_display, timeout=None)
  23.  
  24. def player_init(statu):
  25. print(statu)
  26. try:
  27. # 设置超时时间,如果2秒内,没有达到障碍线程数量,
  28. # 会进入断开状态,引发BrokenBarrierError错误
  29. barrier.wait(2)
  30. except Exception as e: # 断开状态,引发BrokenBarrierError错误
  31. print("等待超时了... ")
  32. else:
  33. print("xxxooooxxxxxooooxxxoooo")
  34.  
  35. if __name__ == '__main__':
  36.  
  37. statu_list = ["init ready","video ready","audio ready"]
  38. thread_list = list()
  39. for i in range(0,3):
  40. t = threading.Thread(target=player_init,args=(statu_list[i],))
  41. t.start()
  42. thread_list.append(t)
  43.  
  44. for t in thread_list:
  45. t.join()

输出结果:

  1. init ready
  2. video ready
  3. audio ready
  4. 初始化通过完成,音视频同步完成,可以开始播放....
  5. xxxooooxxxxxooooxxxoooo
  6. xxxooooxxxxxooooxxxoooo
  7. xxxooooxxxxxooooxxxoooo

注意:如果barrier.wait(timeout=None)等待超时,会进入断开状态,引发BrokenBarrierError错误,为了程序的健壮性,最好加上异常处理;

2.案例二:重置线程障碍数量reset()

  1. # 导入线程模块
  2. import threading
  3.  
  4. def plyer_display():
  5. print('初始化通过完成,音视频同步完成,可以开始播放....')
  6.  
  7. # 设置3个障碍对象
  8. barrier = threading.Barrier(3, action=plyer_display, timeout=None)
  9.  
  10. def player_init(statu):
  11.  
  12. while True:
  13. print(statu)
  14. try:
  15. # 设置超时时间,如果2秒内,没有达到障碍线程数量,
  16. # 会进入断开状态,引发BrokenBarrierError错误
  17. barrier.wait(2)
  18. except Exception as e: # 断开状态,引发BrokenBarrierError错误
  19. # print("断开状态... ")
  20. continue
  21. else:
  22. print("xxxooyyyxxxooyyyxxxooyyy")
  23. break
  24.  
  25. if __name__ == '__main__':
  26.  
  27. statu_list = ["init ready","video ready","audio ready"]
  28. thread_list = list()
  29. for i in range(0,3):
  30. t = threading.Thread(target=player_init,args=(statu_list[i],))
  31. t.start()
  32.  
  33. thread_list.append(t)
  34. if i == 1: # 重置状态
  35. print("不想看爱情片,我要看爱情动作片....")
  36. barrier.reset()
  37.  
  38. for t in thread_list:
  39. t.join()

输出结果:

  1. init ready
  2. video ready
  3. 不想看爱情片,我要看爱情动作片....
  4. init ready
  5. video ready
  6. audio ready
  7. 初始化通过完成,音视频同步完成,可以开始播放....
  8. xxxooyyyxxxooyyyxxxooyyy
  9. xxxooyyyxxxooyyyxxxooyyy
  10. xxxooyyyxxxooyyyxxxooyyy

注意:如果barrier.wait(timeout=None)等待超时,会进入断开状态,引发BrokenBarrierError错误,为了程序的健壮性,最好加上异常处理;

猜你喜欢:

1.python多线程创建和参数传递

2.python多线程条件变量Condition

3.python多线程互斥锁Lock

4.python多线程事件Event

5.python多线程定时器Timer

转载请注明:猿说Python » python线程障碍对象Barrier

技术交流、商务合作请直接联系博主
扫码或搜索:猿说python
猿说python
微信公众号 扫一扫关注

python线程障碍对象Barrier(34)的更多相关文章

  1. Python学习——Python线程

    一.线程创建 #方法一:将要执行的方法作为参数传给Thread的构造方法 import threading import time def show(arg): time.sleep(2) print ...

  2. python 线程 进程 协程 学习

    转载自大神博客:http://www.cnblogs.com/aylin/p/5601969.html 仅供学习使用···· python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和 ...

  3. python基础-第九篇-9.1初了解Python线程、进程、协程

    了解相关概念之前,我们先来看一张图 进程: 优点:同时利用多个cpu,能够同时进行多个操作 缺点:耗费资源(重新开辟内存空间) 线程: 优点:共享内存,IO操作时候,创造并发操作 缺点:抢占资源 通过 ...

  4. c++ 跨平台线程同步对象那些事儿——基于 ace

    前言 ACE (Adaptive Communication Environment) 是早年间很火的一个 c++ 开源通讯框架,当时 c++ 的库比较少,以至于谈 c++ 网络通讯就绕不开 ACE, ...

  5. python——线程与多线程进阶

    之前我们已经学会如何在代码块中创建新的线程去执行我们要同步执行的多个任务,但是线程的世界远不止如此.接下来,我们要介绍的是整个threading模块.threading基于Java的线程模型设计.锁( ...

  6. python——线程与多线程基础

    我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...

  7. [python] 线程简介

    参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...

  8. Python 线程(threading) 进程(multiprocessing)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  9. Python线程:线程的调度-守护线程

    Python线程:线程的调度-守护线程   守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程.在python中建议使用的是thread. ...

随机推荐

  1. LoadRunner学习目录

    已更新: 未更新: 1.loadrunner 11破解版及破解包 2.如何录制一个LR脚本 3.自定义loadrunner脚本

  2. 史上最全java pdf精品书籍整理

    算法,多线程,spring,数据库,大数据,面试题等等.喜欢的小伙伴加群获取 QQ群号825199617 (非广告培训技术群,纯java知识交流,请自重)

  3. linux rand application

    code: #include <stdio.h> #include <stdlib.h> #include <time.h> #define random_1(a, ...

  4. [CTF]抓住那只猫(XCTF 4th-WHCTF-2017)

    原作者:darkless 题目描述:抓住那只猫 思路: 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经执行成功,执行的是一个p ...

  5. [MYSQL手工注入](3)基于报错的SQL注入实战

    0x03 MYSQL 手工注入实战--基于错误的 SQL 注入 今天如愿以偿的找到了基于错误的SQL注入环境了:是一个国外卖音响的小网站,还在建设中: 看一下报错信息: (1)确定闭合语句:从上面的报 ...

  6. 根据数据文件自定义边界条件timeVaryingUniformFixedValue【转载】

    转载自:http://blog.sina.com.cn/s/blog_e256415d0101nf9j.html 在OpenFOAM中,可以创建数据文件,自定义边界条件. 下面的例子读取outletP ...

  7. ubuntu之路——day8.5 学习率衰减learning rate decay

    在mini-batch梯度下降法中,我们曾经说过因为分割了baby batch,所以迭代是有波动而且不能够精确收敛于最小值的 因此如果我们将学习率α逐渐变小,就可以使得在学习率α较大的时候加快模型训练 ...

  8. Java_jdbc 基础笔记之五 数据库连接 (ResultSet)

    /** * ResultSet: 结果集. 封装了使用 JDBC 进行查询的结果. * 1. 调用 Statement 对象的 executeQuery(sql)可以得到结果集. * 2. Resul ...

  9. LF: 换行,U+000A VT: 垂直定位,U+000B FF: 换页符,U+000C CR: 回车符,U+000D CR+LF:CR(U+000D)后跟LF(U+000A) NEL: 下一行,U+0085 LS: 分行,U+2028 PS: 分段,U+2029

    https://zh.wikipedia.org/wiki/換行 换行(英语:newline.line ending.end-of-line (EOL).line Feed (LF).line bre ...

  10. python try except 出现异常时,except 中如何返回异常的信息字符串

    https://docs.python.org/3/tutorial/errors.html#handling-exceptions https://docs.python.org/3/library ...