>  기사  >  백엔드 개발  >  예외 발생 시 재시도 솔루션

예외 발생 시 재시도 솔루션

Y2J
Y2J원래의
2017-05-13 14:00:232438검색

이 글은 주로 Python의 비정상적인 재시도에 대한 솔루션을 소개합니다. 글의 소개는 매우 자세하게 설명되어 있어 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

최근 발견된 새로운 솔루션: 재시도

재시도는 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.randint가 5를 반환할 때까지 끝나지 않고, 그렇지 않으면 다시 실행됩니다.

재시도는 일부 매개변수를 허용할 수도 있습니다. 소스 코드에 있는 Retrying 클래스의 초기화 함수에서 선택적 매개변수를 볼 수 있습니다:

  • <a href="http://www.php.cn/wiki/904.html" target="_blank">top<code>s<a href="http://www.php.cn/wiki/904.html" target="_blank">top</a>_max_attempt_number_max_attempt_number: 이전에는 최대값을 설정합니다. 이 횟수를 초과하면 시도 횟수가 중지됩니다.

  • stop_max_delay 예를 들어 10000으로 설정하면 장식된 시간부터 시작됩니다. 함수가 실행되기 시작하고, 함수가 성공적으로 실행되면 종료됩니다. 또는 실패가 보고되고 종료되는 시점에서 이 기간이 10초를 초과하면 함수가 더 이상 실행되지 않습니다.

  • : 두
  • 시간

    wait_fixedretrying

  • : 두
  • 사이의 체류 시간을 무작위로 생성

    wait_random_min和wait_random_maxretrying

  • : 지수 사용 이 양식은 두
  • 사이의 체류 시간을 생성하며, 생성된 값은

    입니다. wait_exponential_multiplier和wait_exponential_max이 수행된 횟수입니다. 이전에 생성된 값이 retrying의 크기를 초과하면 다음 두 재시도 간의 드웰 값은 모두 2^previous_attempt_number * wait_exponential_multiplier입니다. 이 디자인은 previous_attempt_number 알고리즘을 충족하며 차단 상황을 완화할 수 있습니다. retrywait_exponential_maxwait_exponential_maxexponential backoff예외가 발생할 때 재시도할 예외를 지정할 수 있습니다. retry_on_<a href="http://www.php.cn/%20wiki/%20265.html" target="_blank">예외</a>

    함수
  • 객체
  • 전달:

    retry_on_<a href="http://www.php.cn/wiki/265.html" target="_blank">exception</a>

  • 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예외를 발생시킵니다exception. IOErrorretry결과를 얻을 때 으로 이동할 결과를 지정할 수도 있습니다. 이를 위해서는
을 사용하여 함수 개체를 전달해야 합니다.

retryretry_on_result

def retry_if_result_none(result):
 return result is None
 
@retry(retry_on_result=retry_if_result_none)
def get_result():
 return None

을 성공적으로 실행한 후
함수의 반환 값

이 형식 매개 변수

의 형태로 get_result 함수에 전달됩니다. >, , 그렇지 않으면 함수 값을 종료하고 반환합니다. resultretry_if_result_noneNone요약retry

[관련 추천]

특별히 추천

: "php Programmer Toolbox" V0.1 버전 다운로드2. Python 무료 동영상 튜토리얼

3. Python 기본 입문 튜토리얼

위 내용은 예외 발생 시 재시도 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.