Требуется ли тайм-аут для предотвращения блокировки `requests.get()`, если сетевой интерфейс временно отключается?

Я разрабатываю приложение, в котором мне нужно обрабатывать временные отключения на клиенте (сетевой интерфейс отключается).

Сначала я думал, что описанный ниже подход сработает, но иногда при перезапуске сетевого интерфейса вызов s.get(url) зависал на неопределенный срок:

s = requests.Session()
s.mount('http://stackoverflow.com', HTTPAdapter(max_retries=Retry(total=10, connect=10, read=10)))
s.get(url)

Добавив аргумент ключевого слова timeout=10 к s.get(url), код теперь может обрабатывать это блокирующее поведение:

s = requests.Session()
s.mount('http://stackoverflow.com', HTTPAdapter(max_retries=Retry(total=10, connect=10, read=10)))
s.get(url, timeout=10)

Почему тайм-аут необходим для обработки случаев, когда сетевой интерфейс перезагружается или временно отключается? Почему max_retries=Retry(total=10, connect=10, read=10) не справляется с этим? В частности, почему s.get() не сообщается об отключении сетевого интерфейса, чтобы вместо зависания можно было повторить попытку подключения?


person Shuzheng    schedule 17.04.2020    source источник


Ответы (1)


Попробуйте: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#urllib3.util.retry.Retry

from requests.adapters import HTTPAdapter

s = requests.Session()
s.mount('http://stackoverflow.com', HTTPAdapter(max_retries=5))

Or:

retries = Retry(connect=5, read=2, redirect=5)
http = PoolManager(retries=retries)
response = http.request('GET', 'http://stackoverflow.com')

Or:

response = http.request('GET', 'http://stackoverflow.com', retries=Retry(10))
person Mahsa Hassankashi    schedule 17.04.2020
comment
Я действительно не понимаю, как это отвечает на мой вопрос? - person Shuzheng; 18.04.2020