Python 스 레 드 장애 대상 Barrier 원리 상세 설명

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 오류 가 발생 합 니 다.프로그램의 건장 성 을 위해 이상 처 리 를 하 는 것 이 좋 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기