目錄
- 一.Python 執行緒障礙物件 Barrier 簡介
- 二.Python 執行緒障礙物件 Barrier 原理
- 三.Python 執行緒障礙物件 Barrier 函式介紹
- 四.Python 執行緒障礙物件 Barrier 使用
- 1.案例一:常規使用
- 2.案例二:重置執行緒障礙數量 reset
- 五.猜你喜歡
零基礎 Python 學習路線推薦 : Python 學習目錄 >> Python 基礎入門
Python 執行緒 Barrier 俗稱障礙物件,也稱柵欄,也叫屏障,?
一.Python 執行緒障礙物件 Barrier 簡介
# 匯入執行緒模塊
import threading
'''
引數介紹:
parties — 執行緒計數器,記錄執行緒數量,也稱執行緒障礙數量;
action — 是一個可呼叫函式,當等待的執行緒到達了執行緒障礙數量parties,其中一個執行緒會首先呼叫action 對應函式,之后再執行執行緒自己內部的代碼;
timeout — 默認的超時時間;
'''
# 障礙物件barrier
barrier = threading.Barrier(parties, action=None, timeout=None)
二.Python 執行緒障礙物件 Barrier 原理
與之前介紹 互斥鎖 Lock / 事件 Event / 定時器 Timer 等不同,多執行緒 Barrier 會設定一個執行緒障礙數量 parties ,如果等待的執行緒數量沒有達到障礙數量 parties ,所有執行緒會處于阻塞狀態,當等待的執行緒到達了這個數量就會喚醒所有的等待執行緒,
可能說的有點抽象,以播放器為例子:首先一個執行緒做播放器初始化作業(加載本地檔案或者獲取播放地址),然后一個執行緒獲取視頻畫面,一個執行緒獲取視頻聲音,只有當初始化作業完畢,視頻畫面獲取完畢,視頻聲音獲取完畢,播放器才會開始播放,其中任意一個執行緒沒有完成,播放器會處于阻塞狀態直到三個任務都完成!
三.Python 執行緒障礙物件 Barrier 函式介紹
wait(timeout=None) — 阻塞并嘗試通過障礙,如果等待的執行緒數量大于或者等于執行緒障礙數量 parties ,則表示障礙通過,執行 action 對應函式并執行執行緒內部代碼,反之則繼續等待;
如果 wait(timeout=None) 等待超時,障礙將進入斷開狀態!如果在執行緒等待期間障礙斷開或重置,此方法會引發 BrokenBarrierError 錯誤,注意添加例外處理,演示代碼查看案例一;
reset — 重置執行緒障礙數量,回傳默認的空狀態,即當前阻塞的執行緒重新來過,如果在執行緒等待期間障礙斷開或重置,此方法會引發 BrokenBarrierError 錯誤,注意添加例外處理,演示代碼查看案例二;
四.Python 執行緒障礙物件 Barrier 使用
1.案例一:常規使用
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 執行緒障礙物件 Barrier.py
@Time:2021/05/04 07:37
@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
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 執行緒障礙物件 Barrier.py
@Time:2021/05/04 07:37
@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
"""
# 匯入執行緒模塊
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 錯誤,為了程式的健壯性,最好加上例外處理;
五.猜你喜歡
- Python 條件推導式
- Python 串列推導式
- Python 字典推導式
- Python 不定長引數 *argc/**kargcs
- Python 匿名函式 lambda
- Python return 邏輯判斷運算式
- Python is 和 == 區別
- Python 可變資料型別和不可變資料型別
- Python 淺拷貝和深拷貝
- Python 例外處理
- Python 執行緒創建和傳參
- Python 執行緒互斥鎖 Lock
- Python 執行緒時間 Event
- Python 執行緒條件變數 Condition
- Python 執行緒定時器 Timer
- Python 執行緒信號量 Semaphore
- Python 執行緒障礙物件 Barrier
- Python 執行緒佇列 Queue – FIFO
- Python 執行緒佇列 LifoQueue – LIFO
- Python 執行緒優先佇列 PriorityQueue
- Python 執行緒池 ThreadPoolExecutor(一)
- Python 執行緒池 ThreadPoolExecutor(二)
- Python 行程 Process 模塊
- Python 行程 Process 與執行緒 threading 區別
- Python 行程間通信 Queue / Pipe
- Python 行程池 multiprocessing.Pool
- Python GIL 鎖
未經允許不得轉載:猿說編程 ? Python 執行緒障礙物件 Barrier
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288498.html
標籤:其他
