您好,登錄后才能下訂單哦!
python線程Barrier俗稱障礙對(duì)象,也稱柵欄,也叫屏障。
?
?
1 2 3 4 5 | # 導(dǎo)入線程模塊 import threading ? # 障礙對(duì)象barrier barrier = threading.Barrier(parties, action=None, timeout=None) |
parties?—?線程計(jì)數(shù)器,記錄線程數(shù)量,也稱線程障礙數(shù)量;
action?—?是一個(gè)可調(diào)用函數(shù),當(dāng)?shù)却木€程到達(dá)了線程障礙數(shù)量parties,其中一個(gè)線程會(huì)首先調(diào)用action?對(duì)應(yīng)函數(shù),之后再執(zhí)行線程自己內(nèi)部的代碼;
timeout?—?默認(rèn)的超時(shí)時(shí)間;
與之前介紹 互斥鎖Lock/事件Event/定時(shí)器Timer等不同,多線程Barrier會(huì)設(shè)置一個(gè)線程障礙數(shù)量parties,如果等待的線程數(shù)量沒(méi)有達(dá)到障礙數(shù)量parties,所有線程會(huì)處于阻塞狀態(tài),當(dāng)?shù)却木€程到達(dá)了這個(gè)數(shù)量就會(huì)喚醒所有的等待線程。
?
可能說(shuō)的有點(diǎn)抽象,以播放器為例子:首先一個(gè)線程做播放器初始化工作(加載本地文件或者獲取播放地址),然后一個(gè)線程獲取視頻畫(huà)面,一個(gè)線程獲取視頻聲音,只有當(dāng)初始化工作完畢,視頻畫(huà)面獲取完畢,視頻聲音獲取完畢,播放器才會(huì)開(kāi)始播放,其中任意一個(gè)線程沒(méi)有完成,播放器會(huì)處于阻塞狀態(tài)直到三個(gè)任務(wù)都完成!
?
?
wait(timeout=None)?—?阻塞并嘗試通過(guò)障礙,如果等待的線程數(shù)量大于或者等于線程障礙數(shù)量parties,則表示障礙通過(guò),執(zhí)行action?對(duì)應(yīng)函數(shù)并執(zhí)行線程內(nèi)部代碼,反之則繼續(xù)等待;
如果wait(timeout=None)?等待超時(shí),障礙將進(jìn)入斷開(kāi)狀態(tài)!如果在線程等待期間障礙斷開(kāi)或重置,此方法會(huì)引發(fā)BrokenBarrierError錯(cuò)誤,注意添加異常處理,演示代碼查看案例一;
?
reset()?—?重置線程障礙數(shù)量,返回默認(rèn)的空狀態(tài),即當(dāng)前阻塞的線程重新來(lái)過(guò),如果在線程等待期間障礙斷開(kāi)或重置,此方法會(huì)引發(fā)BrokenBarrierError錯(cuò)誤,注意添加異常處理,演示代碼查看案例二;
?
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(個(gè)人博客地址): shuopython.com @WeChat Official Account(微信公眾號(hào)):猿說(shuō)python @Github:www.github.com ? @File:python_arbrier.py @Time:2019/10/31 21:25 ? @Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! """ ? # 導(dǎo)入線程模塊 import threading ? def plyer_display(): ????print('初始化通過(guò)完成,音視頻同步完成,可以開(kāi)始播放....') ? # 設(shè)置3個(gè)障礙對(duì)象 barrier = threading.Barrier(3, action=plyer_display, timeout=None) ? ? def player_init(statu): ????print(statu) ????try: ????????# 設(shè)置超時(shí)時(shí)間,如果2秒內(nèi),沒(méi)有達(dá)到障礙線程數(shù)量, ????????# 會(huì)進(jìn)入斷開(kāi)狀態(tài),引發(fā)BrokenBarrierError錯(cuò)誤 ????????barrier.wait(2) ????except Exception as e: # 斷開(kāi)狀態(tài),引發(fā)BrokenBarrierError錯(cuò)誤 ????????print("等待超時(shí)了... ") ????else: ????????print("xxxyyyyxxxxxyyyyxxxyyyy") ? 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é)果:
1 2 3 4 5 6 7 | init ready video ready audio ready 初始化通過(guò)完成,音視頻同步完成,可以開(kāi)始播放.... xxxyyyyxxxxxyyyyxxxyyyy xxxyyyyxxxxxyyyyxxxyyyy xxxyyyyxxxxxyyyyxxxyyyy |
注意:如果barrier.wait(timeout=None)等待超時(shí),會(huì)進(jìn)入斷開(kāi)狀態(tài),引發(fā)BrokenBarrierError錯(cuò)誤,為了程序的健壯性,最好加上異常處理;
?
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 | # 導(dǎo)入線程模塊 import threading ? def plyer_display(): ????print('初始化通過(guò)完成,音視頻同步完成,可以開(kāi)始播放....') ? # 設(shè)置3個(gè)障礙對(duì)象 barrier = threading.Barrier(3, action=plyer_display, timeout=None) ? ? def player_init(statu): ? ????while True: ????????print(statu) ????????try: ????????????# 設(shè)置超時(shí)時(shí)間,如果2秒內(nèi),沒(méi)有達(dá)到障礙線程數(shù)量, ????????????# 會(huì)進(jìn)入斷開(kāi)狀態(tài),引發(fā)BrokenBarrierError錯(cuò)誤 ????????????barrier.wait(2) ????????except Exception as e: # 斷開(kāi)狀態(tài),引發(fā)BrokenBarrierError錯(cuò)誤 ????????????# print("斷開(kāi)狀態(tài)... ") ????????????continue ????????else: ????????????print("xxxyyyxxxyyyxxxyyy") ????????????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: # 重置狀態(tài) ????????????print("動(dòng)作片....") ????????????barrier.reset() ? ? ????for t in thread_list: ????????t.join() |
輸出結(jié)果:
1 2 3 4 5 6 7 8 9 10 | init ready video ready 動(dòng)作片.... init ready video ready audio ready 初始化通過(guò)完成,音視頻同步完成,可以開(kāi)始播放.... xxxyyyxxxyyyxxxyyy xxxyyyxxxyyyxxxyyy xxxyyyxxxyyyxxxyyy |
注意:如果barrier.wait(timeout=None)等待超時(shí),會(huì)進(jìn)入斷開(kāi)狀態(tài),引發(fā)BrokenBarrierError錯(cuò)誤,為了程序的健壯性,最好加上異常處理;
?
1.python多線程創(chuàng)建和參數(shù)傳遞
2.python多線程條件變量Condition
3.python多線程互斥鎖Lock
4.python多線程事件Event
5.python多線程定時(shí)器Timer
?
轉(zhuǎn)載請(qǐng)注明:猿說(shuō)Python???python線程障礙對(duì)象Barrier
?
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。