Для большинства запросов к внешним серверам должен быть установлен тайм-аут на случай, если сервер не отвечает своевременно. По умолчанию для запросов не истекает время ожидания, если явно не задано значение времени ожидания. Без тайм-аута, код может зависнуть на несколько минут или больше.
Тайм-аут подключения - это количество секунд, в течение которых клиент будет ждать, пока установится соединение с удаленным компьютером (соответствует вызову .connect()
) в сокете. Рекомендуется устанавливать время ожидания подключения немного больше, чем кратное трем, что является окном повторной передачи TCP-пакетов по умолчанию.
Модуль requests
позволяет указывать максимально время ожидания ответа сервера через аргумент timeout
.
>>> import requests >>> requests.get('https://github.com/', timeout=0.001) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # ... # requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=443)
Примечание: аргумент timeout
(тайм-аут) - это не ограничение по времени на загрузку всего ответа сервера. Исключение возникает, если сервер не отправил ответ за время timeout
в секундах (точнее, если не было получено каких либо байтов на базовый сокет в течение секунд, указанных в timeout
). Если тайм-аут явно не указан, то запрос не прерывается и модуль будет ждать ответа до победного конца.
Как только клиент подключится к серверу и отправит HTTP-запрос, тайм-аут чтения - это количество секунд, в течение которых клиент будет ждать ответа от сервера. (В частности, это количество секунд, которое клиент будет ждать между байтами, отправленными с сервера. В 99,9% случаев это время до того, как сервер отправит первый байт).
Если задается одно значение для таймаута, например:
resp = requests.get('https://github.com', timeout=5)
Значение таймаута будет применяться как к таймаутам подключения, так и к таймаутам чтения. Для того, что бы установить значения таймаутов отдельно, необходимо указать кортеж:
resp = requests.get('https://github.com', timeout=(3.05, 27))
Если удаленный сервер работает очень медленно, то можно попросить библиотеку requests
ждать ответа вечно, передав None
в качестве значения аргумента timeout
, а затем пойти пить кофе.