网站推广员,怎么seo网站推广,苏州网站工作室,c#网站开发模板python线程Barrier俗称障碍对象#xff0c;也称栅栏#xff0c;也叫屏障。一.线程障碍对象Barrier简介# 导入线程模块import threading# 障碍对象barrierbarrier threading.Barrier(parties, actionNone, timeoutNone)parties — 线程计数器#xff0c;记录线程数量#x…python线程Barrier俗称障碍对象也称栅栏也叫屏障。一.线程障碍对象Barrier简介# 导入线程模块import threading# 障碍对象barrierbarrier threading.Barrier(parties, actionNone, timeoutNone)parties — 线程计数器记录线程数量也称线程障碍数量action — 是一个可调用函数当等待的线程到达了线程障碍数量parties其中一个线程会首先调用action 对应函数之后再执行线程自己内部的代码timeout — 默认的超时时间二.线程障碍对象Barrier原理与之前介绍 互斥锁Lock/事件Event/定时器Timer等不同多线程Barrier会设置一个线程障碍数量parties如果等待的线程数量没有达到障碍数量parties所有线程会处于阻塞状态当等待的线程到达了这个数量就会唤醒所有的等待线程。可能说的有点抽象以播放器为例子首先一个线程做播放器初始化工作(加载本地文件或者获取播放地址)然后一个线程获取视频画面一个线程获取视频声音只有当初始化工作完毕视频画面获取完毕视频声音获取完毕播放器才会开始播放其中任意一个线程没有完成播放器会处于阻塞状态直到三个任务都完成三.多线程障碍对象Barrier相关函数介绍wait(timeoutNone) — 阻塞并尝试通过障碍如果等待的线程数量大于或者等于线程障碍数量parties则表示障碍通过执行action 对应函数并执行线程内部代码反之则继续等待如果wait(timeoutNone) 等待超时障碍将进入断开状态如果在线程等待期间障碍断开或重置此方法会引发BrokenBarrierError错误注意添加异常处理演示代码查看案例一reset() — 重置线程障碍数量返回默认的空状态即当前阻塞的线程重新来过如果在线程等待期间障碍断开或重置此方法会引发BrokenBarrierError错误注意添加异常处理演示代码查看案例二四.线程障碍对象Barrier使用1.案例一常规使用# !usr/bin/env python# -*- coding:utf-8 _*-Author:何以解忧Blog(个人博客地址): shuopython.comWeChat Official Account(微信公众号)猿说pythonGithub:www.github.comFile:python_arbrier.pyTime:2019/10/31 21:25Motto:不积跬步无以至千里不积小流无以成江海程序人生的精彩需要坚持不懈地积累# 导入线程模块import threadingdef plyer_display():print(初始化通过完成音视频同步完成可以开始播放....)# 设置3个障碍对象barrier threading.Barrier(3, actionplyer_display, timeoutNone)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(targetplayer_init,args(statu_list[i],))t.start()thread_list.append(t)for t in thread_list:t.join()输出结果init readyvideo readyaudio ready初始化通过完成音视频同步完成可以开始播放....xxxooooxxxxxooooxxxooooxxxooooxxxxxooooxxxooooxxxooooxxxxxooooxxxoooo注意如果barrier.wait(timeoutNone)等待超时会进入断开状态引发BrokenBarrierError错误为了程序的健壮性最好加上异常处理2.案例二重置线程障碍数量reset()# 导入线程模块import threadingdef plyer_display():print(初始化通过完成音视频同步完成可以开始播放....)# 设置3个障碍对象barrier threading.Barrier(3, actionplyer_display, timeoutNone)def player_init(statu):while True:print(statu)try:# 设置超时时间如果2秒内没有达到障碍线程数量# 会进入断开状态引发BrokenBarrierError错误barrier.wait(2)except Exception as e: # 断开状态引发BrokenBarrierError错误# print(断开状态... )continueelse:print(xxxooyyyxxxooyyyxxxooyyy)breakif __name__ __main__:statu_list [init ready,video ready,audio ready]thread_list list()for i in range(0,3):t threading.Thread(targetplayer_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 readyvideo ready不想看爱情片我要看爱情动作片....init readyvideo readyaudio ready初始化通过完成音视频同步完成可以开始播放....xxxooyyyxxxooyyyxxxooyyyxxxooyyyxxxooyyyxxxooyyyxxxooyyyxxxooyyyxxxooyyy注意如果barrier.wait(timeoutNone)等待超时会进入断开状态引发BrokenBarrierError错误为了程序的健壮性最好加上异常处理以上就是本文的全部内容希望对大家的学习有所帮助也希望大家多多支持聚米学院。