У меня есть сервер, который использует запросы для выполнения запросов к другому серверу, который может работать или не работать. Если этот сервер не работает, я не хочу блокировать его надолго; Я могу просто сразу обработать ошибку. Однако параметр тайм-аута, по-видимому, не применяется к процессу установления начального соединения.
С терминала запускаю:
>>> import time
>>> import requests
>>> t1 = time.time() ; exec("try: requests.get('http://192.168.99.100/', timeout=1.0)\nexcept: pass") ; t2 = time.time() ; t2 - t1
21.00611114501953
Это занимает около 21 секунды и не зависит от времени ожидания, которое я даю. Я также пытался использовать тайм-аут eventlet, но получилось то же самое:
>>> import time
>>> import eventlet
>>> requests = eventlet.import_patched('requests')
>>> t1 = time.time() ; exec("try: \n with eventlet.Timeout(1): requests.get('http://192.168.99.100/')\nexcept: pass") ; t2 = time.time() ; t2 - t1
21.00276017189026
Ошибка, которую я получаю для подключения:
ConnectionError: ('Connection aborted.', error(11, 'Resource temporarily unavailable'))
Наконец, я запускаю python в подсистеме Windows для Linux, которая может работать с сокетами по-разному.