![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Aspire |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.5.2012 Репутация: нет Всего: нет |
Здравствуйте, уважаемые гуру. Далее по тексту AE eq AnyEvent.
Подскажите, пожалуйста, каким образом мне можно включить асинхронный резольвинг доменов в паука написанного на AE::HTTP. Вернее, не совсем асинхрон, просто хочу определить таймаут для днс запроса, потому как стандартный около 5 секунд сильно тормозит работу. Предполагаю сделать это с помощью AE::DNS, включив его в коллбэк
Однако я не понимаю как именно это сделать - переписывать все функцию AnyEvent::Socket::tcp_connect? Или проще пропатчить процедуру resolve_sockaddr в пакете AnyEvent::Socket, которая вызывается из tcp_connect для резольвинга домена. Этот путь мне кажется не верным, наверняка все проще, просто я чего-то не знаю. Чтобы было более понятно, попробую изложить вышеописанный вопрос схематично:
Понятно, что мне совсем не понятен порядок действий в коллбеке tcp_connect. Очень буду признателен всем за помощь и примеры. |
||||
|
|||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Callback tcp_connect должен возвратить сокет и инициализировать соединение сокета.
Порядок действий примерно такой: определяете где-то в начале скрипта объект AnyEvent::DNS с нужным таймаутом и другими параметрами, например можно подтюнить max_outstanding (по умолчанию всего 10 одновременных днс запроса) в обратном вызове tcp_connect создаёте сокет и вызываете на нем prepare callback, он возвратит общий таймаут для запроса, и возможно подготовит сокет еще каким-либо образом вызываете метод resolve ранее созданного объекта AnyEvent::DNS в обратном вызове метода resolve делаете AnyEvent::Socket::tcp_connect с таймаутом, который возвратил prepare callback в обратном вызове для AnyEvent::Socket::tcp_connect вызываете connect callback для первоначального обратного вызова tcp_connect Плюс ко всему нужно учесть вариант, что какой-либо из вызовов возвратит ошибку. Нечто похожее, но по другому я делал в AnyEvent::HTTP::Socks: https://github.com/olegwtf/p5-AnyEvent-HTTP...TP/Socks.pm#L73 Но там я использовал таймер для таймаута, плюс не было цели делать таймаут именно для днс запроса. |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Кстати я заглянул в документацию AnyEvent::DNS. Там есть глобальный резолвер $AnyEvent::DNS::RESOLVER, который можно определить нужным образом. Так что всё вышеописанное является лишним.
|
|||
|
||||
| Aspire |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.5.2012 Репутация: нет Всего: нет |
Глобальный все упрощает )
Однако, позвольте уточнить первый вариант, для меня это будет незаменимым опытом.
Это сообщение отредактировал(а) Aspire - 20.5.2012, 17:25 |
|||
|
||||
| Aspire |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.5.2012 Репутация: нет Всего: нет |
Стоп.. что-то лишнее. Сокет вроде
|
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Немного неправильно я вам рассказал. В частности, о том что должен возвратиться сокет из функции. А если он не должен возвращаться, значит и создавать его не нужно вручную. В итоге получилось следующее
|
|||
|
||||
| Aspire |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.5.2012 Репутация: нет Всего: нет |
Pfailed, огромнейший респект.
Спасибо, что помогли разобраться в сложном для меня вопросе. Плюсанул бы, но не хватает прав. |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: нет Всего: 162 |
Сделано. Да, кстати, пометьте тему как решённую. |
|||
|
||||
| Aspire |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 17.5.2012 Репутация: нет Всего: нет |
Ну вот дошла очередь потестить на линуксах.. и оказалось, что днс таймаут там попросту не работает (на виндах все работает на ура, не нарадуюсь просто).
Можете подсказать, в какую сторону копать? |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |