Python 线程障碍对象 Barrier - Python零基础入门教程
目錄
- 一.Python 線程障礙對象 Barrier 簡介
- 二.Python 線程障礙對象 Barrier 原理
- 三.Python 線程障礙對象 Barrier 函數(shù)介紹
- 四.Python 線程障礙對象 Barrier 使用
- 1.案例一:常規(guī)使用
- 2.案例二:重置線程障礙數(shù)量 reset
- 五.猜你喜歡
零基礎(chǔ) Python 學習路線推薦 : Python 學習目錄 >> Python 基礎(chǔ)入門
Python 線程 Barrier 俗稱障礙對象,也稱柵欄,也叫屏障。?
一.Python 線程障礙對象 Barrier 簡介
# 導入線程模塊 import threading''' 參數(shù)介紹:parties — 線程計數(shù)器,記錄線程數(shù)量,也稱線程障礙數(shù)量;action — 是一個可調(diào)用函數(shù),當?shù)却木€程到達了線程障礙數(shù)量parties,其中一個線程會首先調(diào)用action 對應(yīng)函數(shù),之后再執(zhí)行線程自己內(nèi)部的代碼;timeout — 默認的超時時間; '''# 障礙對象barrier barrier = threading.Barrier(parties, action=None, timeout=None)二.Python 線程障礙對象 Barrier 原理
與之前介紹 互斥鎖 Lock / 事件 Event / 定時器 Timer 等不同,多線程 Barrier 會設(shè)置一個線程障礙數(shù)量 parties ,如果等待的線程數(shù)量沒有達到障礙數(shù)量 parties ,所有線程會處于阻塞狀態(tài),當?shù)却木€程到達了這個數(shù)量就會喚醒所有的等待線程。
可能說的有點抽象,以播放器為例子:首先一個線程做播放器初始化工作(加載本地文件或者獲取播放地址),然后一個線程獲取視頻畫面,一個線程獲取視頻聲音,只有當初始化工作完畢,視頻畫面獲取完畢,視頻聲音獲取完畢,播放器才會開始播放,其中任意一個線程沒有完成,播放器會處于阻塞狀態(tài)直到三個任務(wù)都完成!
三.Python 線程障礙對象 Barrier 函數(shù)介紹
wait(timeout=None) — 阻塞并嘗試通過障礙,如果等待的線程數(shù)量大于或者等于線程障礙數(shù)量 parties ,則表示障礙通過,執(zhí)行 action 對應(yīng)函數(shù)并執(zhí)行線程內(nèi)部代碼,反之則繼續(xù)等待;
如果 wait(timeout=None) 等待超時,障礙將進入斷開狀態(tài)!如果在線程等待期間障礙斷開或重置,此方法會引發(fā) BrokenBarrierError 錯誤,注意添加異常處理,演示代碼查看案例一;
reset — 重置線程障礙數(shù)量,返回默認的空狀態(tài),即當前阻塞的線程重新來過,如果在線程等待期間障礙斷開或重置,此方法會引發(fā) BrokenBarrierError 錯誤,注意添加異常處理,演示代碼查看案例二;
四.Python 線程障礙對象 Barrier 使用
1.案例一:常規(guī)使用
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿說編程 @Blog(個人博客地址): www.codersrc.com @File:Python 線程障礙對象 Barrier.py @Time:2021/05/04 07:37 @Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!"""# 導入線程模塊 import threadingdef plyer_display():print('初始化通過完成,音視頻同步完成,可以開始播放....')# 設(shè)置3個障礙對象 barrier = threading.Barrier(3, action=plyer_display, timeout=None)def player_init(statu):print(statu)try:# 設(shè)置超時時間,如果2秒內(nèi),沒有達到障礙線程數(shù)量,# 會進入斷開狀態(tài),引發(fā)BrokenBarrierError錯誤barrier.wait(2)except Exception as e: # 斷開狀態(tài),引發(fā)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()''' 輸出結(jié)果:init ready video ready audio ready 初始化通過完成,音視頻同步完成,可以開始播放.... xxxooooxxxxxooooxxxoooo xxxooooxxxxxooooxxxoooo xxxooooxxxxxooooxxxoooo'''注意:如果 barrier.wait(timeout=None) 等待超時,會進入斷開狀態(tài),引發(fā) BrokenBarrierError 錯誤,為了程序的健壯性,最好加上異常處理;
2.案例二:重置線程障礙數(shù)量 reset
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿說編程 @Blog(個人博客地址): www.codersrc.com @File:Python 線程障礙對象 Barrier.py @Time:2021/05/04 07:37 @Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!"""# 導入線程模塊 import threadingdef plyer_display():print('初始化通過完成,音視頻同步完成,可以開始播放....')# 設(shè)置3個障礙對象 barrier = threading.Barrier(3, action=plyer_display, timeout=None)def player_init(statu):while True:print(statu)try:# 設(shè)置超時時間,如果2秒內(nèi),沒有達到障礙線程數(shù)量,# 會進入斷開狀態(tài),引發(fā)BrokenBarrierError錯誤barrier.wait(2)except Exception as e: # 斷開狀態(tài),引發(fā)BrokenBarrierError錯誤# print("斷開狀態(tài)... ")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(target=player_init,args=(statu_list[i],))t.start()thread_list.append(t)if i == 1: # 重置狀態(tài)print("不想看愛情片,我要看愛情動作片....")barrier.reset()for t in thread_list:t.join()''' 輸出結(jié)果:init ready video ready 不想看愛情片,我要看愛情動作片.... init ready video ready audio ready 初始化通過完成,音視頻同步完成,可以開始播放.... xxxooyyyxxxooyyyxxxooyyy xxxooyyyxxxooyyyxxxooyyy xxxooyyyxxxooyyyxxxooyyy'''注意:如果 barrier.wait(timeout=None) 等待超時,會進入斷開狀態(tài),引發(fā) BrokenBarrierError 錯誤,為了程序的健壯性,最好加上異常處理;
五.猜你喜歡
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python 線程障礙對象 Barrier
總結(jié)
以上是生活随笔為你收集整理的Python 线程障碍对象 Barrier - Python零基础入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python bytes 和 strin
- 下一篇: Python str / bytes /