日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python barrier_Python线程障碍对象Barrier原理详解

發布時間:2023/12/20 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python barrier_Python线程障碍对象Barrier原理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

@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()

# 導入線程模塊

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 barrier_Python线程障碍对象Barrier原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。