Python 스 레 드 장애 대상 Barrier 원리 상세 설명
1.스 레 드 장애 대상 Barrier 안내
#
import threading
# barrier
barrier = threading.Barrier(parties, action=None, timeout=None)
parties―스 레 드 카운터,스 레 드 수량 을 기록 하고 스 레 드 장애 수량 이 라 고도 합 니 다.action―호출 가능 한 함수 입 니 다.기다 리 는 스 레 드 가 스 레 드 장애 수량 파티 에 도 착 했 을 때 그 중의 한 스 레 드 는 먼저 action 대응 함 수 를 호출 한 다음 에 스 레 드 자체 내부 코드 를 실행 합 니 다.
timeout―기본 시간 초과;
2.스 레 드 장애 대상 Barrier 원리
이전에 소개 한 상호 배척 잠 금/이벤트 Event/타이머 Timer 등 과 달리 다 중 스 레 드 Barrier 는 스 레 드 장애 수량 parties 를 설정 합 니 다.기다 리 는 스 레 드 수량 이 장애 수량 parties 에 이 르 지 않 으 면 모든 스 레 드 가 막 힌 상태 에 있 습 니 다.기다 리 는 스 레 드 가 이 수량 에 도착 하면 모든 대기 스 레 드 를 깨 웁 니 다.
약간 추상 적 이 라 고 할 수 있 습 니 다.재생 기 를 예 로 들 면 먼저 하나의 스 레 드 가 재생 기 초기 화 작업(로 컬 파일 을 불 러 오 거나 재생 주 소 를 가 져 옵 니 다)을 한 스 레 드 가 영상 화면 을 가 져 옵 니 다.한 스 레 드 가 영상 소 리 를 가 져 옵 니 다.처음에 시작 작업 이 끝 났 고 주파수 화면 이 가 져 왔 습 니 다.영상 소리 가 가 져 와 야 재생 기 를 시작 합 니 다.그 중 임의의 스 레 드 가 완성 되 지 않 았 습 니 다.재생 기 는 세 가지 작업 이 완 료 될 때 까지 차단 상태 에 있 습 니 다!
3.다 중 스 레 드 장애 대상 Barrier 관련 함수 소개
wait(timeout=None)―장 애 를 막 고 통과 하려 고 시도 합 니 다.기다 리 는 스 레 드 수량 이 스 레 드 장애 수량 parties 보다 많 거나 같 으 면 장 애 를 통과 하고 action 대응 함 수 를 실행 하 며 스 레 드 내부 코드 를 실행 하 며 반대로 계속 기다 리 는 것 을 의미 합 니 다.wait(timeout=None)대기 시간 이 초과 되면 장 애 는 끊 긴 상태 로 들 어 갑 니 다!스 레 드 대기 기간 에 장애 가 끊 기거 나 리 셋 되면 이 방법 은 BrokenBarrier Error 오 류 를 일 으 킬 수 있 습 니 다.이상 처 리 를 추가 하고 데모 코드 는 사례 1 을 봅 니 다.
reset()-스 레 드 장애 수량 을 초기 화하 고 기본 적 인 빈 상태 로 돌아 갑 니 다.즉,현재 막 힌 스 레 드 를 다시 시작 합 니 다.스 레 드 대기 기간 에 장애 가 끊 기거 나 리 셋 되면 이 방법 은 BrokenBarrier Error 오 류 를 일 으 킬 수 있 습 니 다.이상 처 리 를 추가 하고 데모 코드 는 사례 2 를 봅 니 다.
4.스 레 드 장애 대상 Barrier 사용
1.사례 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)대기 시간 이 초과 되면 차단 상태 에 들 어가 BrokenBarrier Error 오류 가 발생 합 니 다.프로그램의 건장 성 을 위해 이상 처 리 를 하 는 것 이 좋 습 니 다.2.사례 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)대기 시간 이 초과 되면 차단 상태 에 들 어가 BrokenBarrier Error 오류 가 발생 합 니 다.프로그램의 건장 성 을 위해 이상 처 리 를 하 는 것 이 좋 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.