Требуется ли тайм-аут, чтобы предотвратить блокировку `request.get ()`, если сетевой интерфейс временно отключается? - PullRequest
0 голосов
/ 17 апреля 2020

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

Сначала я думал, что приведенный ниже подход будет работать, но иногда, если перезапустить сетевой интерфейс вызов 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() не информируется о том, что сетевой интерфейс отключился, чтобы он мог повторить попытку соединения вместо зависания?

1 Ответ

0 голосов
/ 17 апреля 2020

Попробуйте: 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))

Или:

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

Или:

response = http.request('GET', 'http://stackoverflow.com', retries=Retry(10))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...