Я делаю сборщик URL-адресов в Go и имею список URL-адресов для получения. Я отправляю http.Get()
запросы на каждый URL и получаю от них ответ.
resp,fetch_err := http.Get(url)
Как я могу установить индивидуальный тайм-аут для каждого запроса Get? (Время по умолчанию очень велико, и это делает мой сборщик очень медленным.) Я хочу, чтобы мой сборщик имел тайм-аут около 40-45 секунд, после чего он должен вернуть «запрос истек» и перейти к следующему URL-адресу.
Как я могу этого добиться?
Ответы:
Видимо в Go 1.3 http.Client есть поле Timeout
Это помогло мне.
источник
Get
возвращать ошибку? Я немного сбит с толку, потому что Godoc forClient
говорит: таймер продолжает работать после возврата Get, Head, Post или Do и прерывает чтение Response.Body. Так что это означает , что либоGet
или чтениеResponse.Body
может быть прерван из -за ошибки?http.Client.Timeout
vs.http.Transport.ResponseHeaderTimeout
?http.Client.Timeout
включает время на чтение тела ответа,http.Transport.ResponseHeaderTimeout
но не включает его.Вам необходимо настроить собственный клиент с собственным транспортом, который использует настраиваемую функцию набора номера, которая оборачивается вокруг DialTimeout .
Что - то вроде (полностью непроверенным ) это :
источник
Чтобы добавить к ответу Волкера, если вы также хотите установить тайм-аут чтения / записи в дополнение к таймауту подключения, вы можете сделать что-то вроде следующего
Этот код протестирован и работает в продакшене. Полный текст тестов доступен здесь https://gist.github.com/dmichael/5710968.
Имейте в виду, что вам нужно будет создавать нового клиента для каждого запроса, поскольку он
conn.SetDeadline
ссылается на точку в будущем изtime.Now()
источник
Если вы хотите делать это по запросу, обработка ошибок игнорируется для краткости:
источник
http.Client.Timeout
.Быстрый и грязный способ:
Это мутирующее глобальное состояние без какой-либо координации. Тем не менее, это может быть нормально для вашего сборщика URL. В противном случае создайте частный экземпляр
http.RoundTripper
:Ничего из вышеперечисленного не тестировалось.
источник
http.DefaultTransport.(*http.Transport).ResponseHeaderTimeout = time.Second * 45
помогите мне много в тесте записи для тайм-аута запроса. Большое спасибо.Вы можете использовать https://github.com/franela/goreq, который обрабатывает тайм-ауты модным и простым способом.
источник
Это может помочь, но обратите внимание, что
ResponseHeaderTimeout
запускается только после того, как соединение установлено.источник