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
@mo程式設計客棧tto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
"""
# 匯入執行緒模組
import threading
def plyer_display():
print('初始化通過完成,音**同步完成,可以開始**....')
# 設定3個障礙物件
barrier = threading.barrier(3, ac timeout=none)
def player_init(statu):
print(statu)
try:
# 設定超時時間,如果2秒內,沒有達到障礙執行緒數量,
# 會進入斷開狀態,引發brokenbarriererror錯誤
barrier.wait(2)
except exception as e: # 斷開狀態,引發brokenbarriererror錯誤
print("等待超時了... ")
else:
print("***oooo***xxoooo***oooo")
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
初始化通過完成,音**同步完成,可以開始**....
***oooo***xxoooo***oooo
***oooo***xxoooo***oooo
***oooo***xxoooo***oooo
注意:如果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("***ooyyy***ooyyy***ooyyy")
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
初始化通過完成,音**同步完成,可以開始**....
***ooyyy***ooyyy***o
***ooyyy***ooyyy***ooyyy
***ooyyy***ooyyy***ooyyy
注意:如果barrier.wait(timeout=none)等待超時,會進入斷開狀態,引發brokenbarriererror錯誤,為了程式的健壯性,最好加上異常處理;
本文標題: python執行緒障礙物件barrier原理詳解
本文位址:
Python執行緒障礙物件Barrier原理詳解
python執行緒barrier俗稱障礙物件,也稱柵欄,也叫屏障。一.執行緒障礙物件barrier簡介 匯入執行緒模組 import threading 障礙物件barrier barrier threading.barrier parties,action none,timeout none pa...
python執行緒中的執行緒鎖Lock物件
原語鎖定 或互斥鎖定 是乙個同步原語,狀態是 已鎖定 或者 未鎖定 之一。兩個方法 acquire 和 release 用於修改鎖定的狀態。如果狀態已鎖定,嘗試獲取鎖定將被阻塞,直到鎖定被釋放為止。如果有多個執行緒等待獲取鎖定,當鎖定釋放時,只有乙個執行緒能獲得它。等待執行緒獲得鎖定的順序沒有定義。...
Python多執行緒 (4)queue物件
有了python執行緒的基礎概念python多執行緒 1 之基本概念 在python中應用執行緒,threading模組的了解python多執行緒 2 之threading模組 以及多執行緒程式設計中最重要的一方面 同步python多執行緒 3 同步 具體來說,實現的方式也是和很簡單的,可以理解為建...