Python 에서 이상 재 시도 한 솔 루 션 상세 설명

머리말
모두 가 데이터 캡 처 를 할 때 네트워크 문제 로 인 한 프로그램 저장 을 자주 만 났 습 니 다.이전 에는 잘못된 내용 만 기록 하고 잘못된 내용 을 후기 처리 하 였 습 니 다.
원래 의 절차:

def crawl_page(url):
 pass
 
def log_error(url):
 pass
 
url = ""
try:
 crawl_page(url)
except:
 log_error(url)
개 선 된 프로 세 스:

attempts = 0
success = False
while attempts < 3 and not success:
 try:
  crawl_page(url)
  success = True
 except:
  attempts += 1
  if attempts == 3:
   break
최근 발 견 된 새로운 솔 루 션:retrying
retrying 은 Python 의 재 시도 패키지 로 실 패 했 을 수도 있 는 프로그램 을 자동 으로 재 시도 할 수 있 습 니 다.retrying장식 기 함수retry를 제공 합 니 다.장 식 된 함 수 는 실행 에 실패 한 조건 에서 다시 실 행 됩 니 다.기본적으로 계속 잘못 보고 하면 계속 다시 시도 합 니 다.

import random
from retrying import retry
 
@retry
def do_something_unreliable():
 if random.randint(0, 10) > 1:
  raise IOError("Broken sauce, everything is hosed!!!111one")
 else:
  return "Awesome sauce!"
 
print do_something_unreliable()
만약 우리 가have_a_try함 수 를 실행한다 면random.randint5 로 돌아 갈 때 까지 실행 이 끝 날 것 입 니 다.그렇지 않 으 면 계속 다시 실 행 될 것 입 니 다.
retry 는 일부 인 자 를 받 아들 일 수 있 습 니 다.이 소스 코드 에서 Retrying 류 의 초기 화 함 수 는 선택 할 수 있 는 인 자 를 볼 수 있 습 니 다.
  • stop_max_attempt_number:최대 시도 횟수 를 설정 하고 이 횟수 를 초과 하면 재 시도 중지
  •   stop_max_delay:예 를 들 어 10000 으로 설정 하면 장식 되 어 있 는 함수 가 실행 되 는 시간 부터 함수 가 성공 적 으로 실행 되 거나 실 패 를 보고 하여 중단 되 는 시간 까지 이 시간 이 10 초 를 초과 하면 함 수 는 다시 실행 되 지 않 습 니 다
  • .
  • wait_fixed:두 번retrying사이 에 설 치 된 체류 시간
  • wait_random_min wait_random_max:무 작위 로 두 번retrying간 의 체류 시간
  • 을 발생 시킨다.
  • wait_exponential_multiplier wait_exponential_max:지수 형식 으로 두 번retrying간 의 체류 시간 을 발생 시 키 고 발생 하 는 수 치 는2^previous_attempt_number * wait_exponential_multiplier이 며previous_attempt_number는 앞에서 이미retry의 횟수 이다.만약 에 발생 하 는 이 수치 가wait_exponential_max의 크기 를 초과 하면 그 다음 에 두 retrying 간 의 체류 치 는 모두wait_exponential_max이다.이 디자인 은exponential backoff알고리즘 에 맞 춰 막 힌 상황 을 줄 일 수 있다.4567918)
  • 우 리 는 어떤 이상 이 발생 했 을 때 retry 로 가 야 하 는 지 지정 할 수 있 습 니 다.이것 은retry_on_exception함수 대상 에 전달 해 야 합 니 다.
  • 
    def retry_if_io_error(exception):
     return isinstance(exception, IOError)
     
    @retry(retry_on_exception=retry_if_io_error)
    def read_a_file():
     with open("file", "r") as f:
      return f.read()
    read_a_file함 수 를 실행 하 는 과정 에서 이상 을 보고 하면 이 이상 은 형 삼exception으로retry_if_io_error함수 에 들 어가exceptionIOError이면retry진행retry하고 그렇지 않 으 면 운행 을 중단 하고 이상 을 던 집 니 다.
    우 리 는 또 어떤 결 과 를 얻 을 때retry_on_result로 가 야 하 는 지 지정 할 수 있 습 니 다.이것 은get_result함수 대상 에 전달 해 야 합 니 다.
    
    def retry_if_result_none(result):
     return result is None
     
    @retry(retry_on_result=retry_if_result_none)
    def get_result():
     return None
    실행result에 성공 하면 함수 의 반환 값 을 형 삼retry_if_result_none형식 으로None함수 에 전달 하고 반환 값 이retry이면(4567914)진행(4567914)합 니 다.그렇지 않 으 면 함수 값 을 끝내 고 되 돌려 줍 니 다.
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기