Q: Каждый раз создавать новый объект http.Request?

108 views
Skip to first unread message

Gerasim

unread,
Feb 22, 2015, 1:55:27 PM2/22/15
to gola...@googlegroups.com
Добрый вечер!


Создаю http.Request
1. req, err = http.NewRequest("GET", "http://www.site.ru", bytes.NewBuffer([]byte{}))
2. торжественно в цикле с паузами его выполняю. Все работает ок.
3. меняю в файле (windows) etc\hosts IP адрес у www.site.ru на несуществующий
4. цикл работает как ни в чем не бывало
5. где то через 2 минуты падает по таймауту

Вопрос.
Почему падает не сразу? Как можно ускорить процесс падения? :)
может кто знает куда копать?
net/http ресолвит IP адрес и сохраняет его у себя в кэше? Или keep-alive сессия с сервером? Или в кэше Винды еще действует старый DNS?

спасибо за любую наметку )
Гера

Вячеслав Бахмутов

unread,
Feb 22, 2015, 3:04:21 PM2/22/15
to gola...@googlegroups.com
Напишите сюда полный код.

воскресенье, 22 февраля 2015 г., 15:55:27 UTC-3 пользователь Gerasim написал:

Daniel Podolsky

unread,
Feb 22, 2015, 3:09:12 PM2/22/15
to gola...@googlegroups.com
> keep-alive сессия с сервером
ставлю на этот вариант. но, вообще-то, надо взять снифер да посмотреть.

Alexey Palazhchenko

unread,
Feb 22, 2015, 3:11:12 PM2/22/15
to gola...@googlegroups.com
Добрый день,

> 1. req, err = http.NewRequest("GET", "http://www.site.ru", bytes.NewBuffer([]byte{}))

Можно передать nil последним аргументом. :)

–-–
Алексей «AlekSi» Палажченко

Silent

unread,
Feb 24, 2015, 1:09:11 AM2/24/15
to gola...@googlegroups.com
Почему падает не сразу?
Если предположить что у вас цикл сделан как-то так
for i:=0; i < N; i++ {
  go func() {
    ...
    req, err = http.NewRequest("GET", "http://www.site.ru", bytes.NewBuffer([]byte{}))
    ...
  }()
}
то в этом случае запросы будут висеть "до упора", пока тайм-лимит не истечет.
 
Как можно ускорить процесс падения? :)
Можно воспользоваться http.Transport и указать время таймаута, пример http://stackoverflow.com/questions/16895294/how-to-set-timeout-for-http-get-requests-in-golang 

Alexandr Lurye

unread,
Feb 24, 2015, 6:03:14 AM2/24/15
to gola...@googlegroups.com
Две гипотезы:
1. Как уже говорили keep-alive (если вы создаёте объект Transport и используете для нескольких запросов). Тогда пока соединение не закроется, оно продолжит работать даже после изменения hosts.
2. Может быть, ресолвер в Windows не проверяет свежесть файла hosts перед каждым ресолвом адреса, а кэширует его на несколько минут, например.

Гипотеза 1 проверяется отключением keep-alive (созданием нового транспорта перед каждым запросом), если вы его используете, конечно.

Гипотеза 2 проверяется какой-нибудь утилитой типа filemon - посмотрите, как ваш процесс читает файл hosts. Если он его каждый раз читает - значит гипотеза не верна. Если раз в несколько минут, то верна.

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Igor Yurchenko

unread,
Feb 24, 2015, 10:22:20 AM2/24/15
to gola...@googlegroups.com
Кеширует резолвер системы... Наверное можно залезть в реестр винды, но не факт что остальные приложения системы будут в восторге от такого вмешательства.
Вопрос, зачем? Какую задачу решаем? Если вам надо проверять доступность хоста, используйте icmp.

понедельник, 23 февраля 2015 г., 1:55:27 UTC+7 пользователь Gerasim написал:
Reply all
Reply to author
Forward
0 new messages