Примечание к себе
Большое спасибо Питер Бенгтссон
Это установит функцию, которая в качестве замены сброса на requests.get
Звонок может позволить вам делать запросы с помощью RESRIES.
import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry def requests_retry_session( retries=3, backoff_factor=0.3, status_forcelist=(500, 502, 504), session=None, ): session = session or requests.Session() retry = Retry( total=retries, read=retries, connect=retries, backoff_factor=backoff_factor, status_forcelist=status_forcelist, ) adapter = HTTPAdapter(max_retries=retry) session.mount('http://', adapter) session.mount('https://', adapter) return session
Некоторое тестирование всегда хорошо.
t0 = time.time() try: response = requests_retry_session().get( 'http://httpbin.org/status/500', ) except Exception as x: print('It failed :(', x.__class__.__name__) else: print('It eventually worked', response.status_code) finally: t1 = time.time() print('Took', t1 - t0, 'seconds')
Интуиция
Алгоритм этого отборочного перерыва задокументирован здесь : Коэффициент отключения для применения между попытками после второй попытки (большинство ошибок разрешаются немедленно второй попыткой без задержки). Urllib3 будет спать для: {коэффициент отступления} * (2 ^ ({количество общих повторений} – 1)) секунд. Если backoff_factor составляет 0,1, то Sleep () будет спать для [0,0 с, 0,2 с, 0,4 с, …] между повторными. Это никогда не будет длиннее, чем повторение. Backoff_max. По умолчанию отключен отключен (устанавливается на 0).
Оригинал: “https://dev.to/ssbozy/python-requests-with-retries-4p03”