2017-12-06 1 views
1

요청시 재시도 메커니즘을 구현하기 위해 python3과 함께 요청 모듈을 사용하고 있습니다. 다음요청 재 시도로 작업하는 동안 BACKOFF_MAX를 재정의하는 방법

내가 명명 된 인수 (BACKOFF_MAX 재시 클래스) 최대 백 오프를 설정하는 표시되지 않습니다 내 코드 -

session = session or requests.Session() 
retry = Retry(
    total=retries, 
    read=retries, 
    connect=retries, 
    backoff_factor=backoff_factor, 
    status_forcelist=status_forcelist, 
    method_whitelist=method_whitelist) 
retry.BACKOFF_MAX = 60 
adapter = HTTPAdapter(max_retries=retry) 
session.mount(BASE_URL, adapter) 
return session 

입니다. 나는 60 초 이상 재시도 사이에 수면 시간을 원하지 않는다. 어떻게 구현할 수 있습니까? BACKOFF_MAX이

답변

1

작동하지 않습니다 재설정 나는이, 나는이 같은 문제를 가지고 다시 시도 클래스

class RetryRequest(Retry): 

    DEFAULT_METHOD_WHITELIST = frozenset([ 
    'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) 

    def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, 
      method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, 
      backoff_factor=0, raise_on_redirect=True, raise_on_status=True, 
      history=None, respect_retry_after_header=True, max_backoff=60): 
     super(RetryRequest, self).__init__(total=total, connect=connect, read=read, redirect=redirect, status=status, 
      method_whitelist=method_whitelist, status_forcelist=status_forcelist, 
      backoff_factor=backoff_factor, raise_on_redirect=raise_on_redirect, raise_on_status=raise_on_status, 
      history=history, respect_retry_after_header=respect_retry_after_header) 
     self.backoff_max = max_backoff 

    def get_backoff_time(self): 
    """ Formula for computing the current backoff 
    :rtype: float 
    """ 
     # We want to consider only the last consecutive errors sequence (Ignore redirects). 
     consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, 
               reversed(self.history)))) 
     if consecutive_errors_len <= 1: 
      return 0 

     backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) 
     return min(self.backoff_max, backoff_value) 

의 get_backoff_time()를 재정의하고이 클래스를 사용하는 대신 시도

session = session or requests.Session() 
retry = RetryRequest(
     total=retries, 
     read=retries, 
     connect=retries, 
     backoff_factor=backoff_factor, 
     status_forcelist=status_forcelist, 
     method_whitelist=method_whitelist, 
     max_backoff=max_backoff # in my case 60 
) 
adapter = HTTPAdapter(max_retries=retry) 
session.mount(BASE_URL, adapter) 
return session 
0

하여이 작업을 얻었다 나를 위해 일했다 :

class RetryRequest(Retry): 
    def __init__(self, backoff_max=60, **kwargs): 
    super(RetryRequest, self).__init__(**kwargs) 
    self.BACKOFF_MAX = backoff_max 

나는을 무시할 필요가 없다고 생각한다., 단순히 생성자를 오버라이드하고 self.BACKOFF_MAX으로 설정하면 효과가 있습니다. 또한 kwargs을 사용하면 다른 매개 변수를 생략 할 수 있습니다.

관련 문제