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

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错误,为了程序的健壮性,最好加上异常处理;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring AOP 五大通知类型

1.前置通知 在目标方法执行之前执行执行的通知。 前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该对象可以获取目标对象 和 目标方法相关的信息。 注意&…

转载CSDN博文精选:Android系列开发博客资源汇总

CSDN博客本期热文推荐,为您介绍有关Android应用开发的10个博客,分享他们的日积月累的宝贵经验,希望这些文章对Android开发者们能有所启发和帮助。 [1] 张国威:Android从入门到提高系列 前面写了十四篇关于界面的入门文章&#xff…

简单工厂模式+工厂方法模式

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; …

Windows下搭建ESP-IDF开发环境,适合ESP32/S2/C3/S3系列模组二次开发

前言本教程适用于以下两种用户:①无Linux环境搭建经验或搭建Linux开发环境不成功;②使用安信可windows一体化环境IDE V1.5开发环境搭建不成功;本教程提供了windows下搭建 ESP-IDF 开发环境的方法。适用系统:Windows 10 64 位版本、…

python中 1.34e3_Python快速编程入门——第2章 Python基础语法

第2章 python基础语法一、基本语法二、变量和数据类型三、标识符和关键字四、简单数值类型一、基本语法注释:Python的注释是用# 不像C/C使用的是//或者/*/。多行注释好像挺麻烦。行与缩进:Python中的特色是缩进而C/C语言一般都是使用的括号来表示范围。如…

Lync Server 2010的部署系列_第六章 安装配置拓扑生成器、前端Server、前端池

一、安装 Lync Server 2010 管理工具(包括拓扑生成器) 1) 登录Front.Gianthard.com(192.168.1.21)。在“Microsoft Lync Server 2010 - 部署向导”页上,单击“安装拓扑生成器”。 2) 进行SQL方面的客户端。 3) 安装成功…

CF1042F Leaf Sets (贪心+树上构造)

题目大意:给你一棵树,让你对叶节点分组,保证每组中,任意两个叶节点之间的距离不大于K,求最小的组数 手动yy的贪心竟然对的 对于每个节点,维护一个$ma[i]$,表示在$i$节点的子树内 未被分组的叶节…

被 HR 直接怼:估计你一辈子就是个程序员

今天看到一个非常扯蛋的事情。事情来自网络,不是作者本人。我一直认为程序员是可以做一辈子的事情,程序员是一种做得越久技术越熟练的工作。但是有的人并不这样认为。---有程序员因为能力很强,公司非常满意,结果派了一位 HR 与其谈…

一起谈.NET技术,在MVC2.0使用Lodop为WEB打印提出完美解决方案

通过好友CallHot介绍Lodopweb打印控件。由于是国人开发的,故这两天认真了研究下,打算在未来的项目中使用。现将学习成果与园友分享。如果存在不足的地方,希望您指出。 具体的实现步骤如下: 一、准备工作 1.MVC2.0 jQuery1.4.1 开…

树莓派4b搭建个人云_树莓派4B NAS系统搭建

一、硬盘挂载由于之前硬盘(NTFS格式)里有数据不想格式化想直接挂载,就没有格式化成ext4文件格式的。安装ntfs-3gsudo apt-get install ntfs-3g加载内核模块modprobe fuse查看硬盘情况fdis -l将硬盘挂载到/mnt下ntfs-3g /dev/sda1 /mnt实现开机自动挂载vim /etc/fsta…

(转)python调取C/C++的dll生成方法

本文针对Windows平台下,python调取C/C的dll文件。 1.如果使用C语言,代码如下,文件名为test.c。 __declspec(dllexport) int sum(int a,int b) {return (a b); } 如果使用C语言,代码如下,文件名为test_cpp.cpp。在Wind…

生产者-消费者模式

生产者/消费者问题的多种Java实现方式 实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的。在博文《一种面向作业流(工作流)的轻量级可复用…

周末,说下我喜欢的篮球

我应该有很久没有看NBA比赛了,没有其他原因,确实是因为工作太忙了,即使是在带薪上厕所,也没有足够的时间看下NBA比赛。如果说忙是一个比较好的托词,那还有一个原因,我现在更多的喜欢野球圈的新闻。刚毕业那…

数据结构+算法 学习计划与资源

学了很多杂乱的技术,继续成长 渐感吃力,重新学习数据结构 与 算法. 计划: 1.严蔚敏《数据结构》《大话数据结构》,每天一个小例子。 2.采用C 或者C 。尽量用C实现,以辅助理解面向对象编程思想。 3.与同学每天练习、讨论…

没有串口,如何打印单片机调试信息?

输出调试信息是嵌入式开发中必不可少的调试利器,嵌入式开发的一个特点是很多时候没有操作系统,或者没有文件系统,常规的打印log到文件的方法基本不适用。最常用的是通过串口输出uart log,例如51单片机,只要实现串口驱动…

[luogu4571 JSOI2009] 瓶子和燃料 (数论)

传送门 Solution 题目说的很迷&#xff0c;但可以发现两个瓶子互相倒最少是容积的gcd 那么题目就转化为求其中选k个瓶子gcd的最大值&#xff0c;这个可以分解因数&#xff0c;枚举因数得到 Code //By Menteur_Hxy #include <map> #include <cmath> #include <cs…

线程池 调度 java_java调度器和线程池总结

一、推荐使用的调度器和线程池1、调度器//2个线程的调度器private static ScheduledThreadPoolExecutor pool new ScheduledThreadPoolExecutor(2);//5秒钟后每3分钟执行一次pool.scheduleAtFixedRate(new TestTask(), 5, 60 * 3, TimeUnit.SECONDS);;2、线程池//10个线程的线…

JVM GC调优总结 -Xms -Xmx -Xmn -Xss

堆大小设置 JVM 中最大堆大小有三方面限制&#xff1a;相关操作系统的数据模型&#xff08;32-bt还是64-bit&#xff09;限制&#xff1b;系统的可用虚拟内存限制&#xff1b;系统的可用物理内存限制。32位系统下&#xff0c;一般限制在1.5G~2G&#xff1b;64为操作系统对内存无…

MFC应用程序实例

新建FirstMFC对话框应用程序 此程序是开发一个口令对话框程序&#xff0c;包含了模式对话框与非模式方式调用对话框。 详细见源文件&#xff0c;地址&#xff1a; 共享链接&#xff1a;http://u.163.com/b47tr9n提取码&#xff1a;zxx0o2v2 小时钟程序 主要包含了定时器的启动与…

Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数

1. 前言 很多朋友在调试驱动的时候&#xff0c;都会遇到这样一个场景&#xff1a;修改一个参数&#xff0c;然后调用某个内核中的函数。比如将某个gpio的值拉高/拉低&#xff0c;修改某个寄存器的值等等。如果每一个参数都通过字符设备的ioctl接口&#xff0c;增加对应的cmd&am…