![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
необходимо прервать соединение LWP по таймауту. родной $lwp -> timeout ($timeout); это для того, чтобы не останавливаться, когда ждешь ответа сервера .. но бывают ситуации, когда ответ есть, но очень медленный. такие ответы нужно прерывать по таймауту есть ли в LWP такая опция? попробовал использовать в своем многопоточном грабере конструкцию вида my $response = undef; eval { local $SIG{ALRM} = sub { die "timeout"; }; alarm ($timeout); UNSAFE_SIGNALS { $response = $lwp -> request ($req); }; if (defined $response -> code) { print $response -> code ."\t". scalar (@threads). "\t" .$url. "\n"; } alarm (0); }; но в виндоус она не работает. в линукс работает, но eval обрывает все потоки и останавливает грабер вообщем вообще работает некорректно многопоточная работа основана на use threads; use threads::shared; use Thread::Queue; подскажите как быть кто где и как (многопоточно) реализовывал обрыв соединения по таймауту?? большое спасибо |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
эээ... имеешь ввиду узкий канал?? -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
совершенно верно.
бывает канал сам по себе узкий. а бывает его преднамеренно сужают... ![]() но мне нужно просто оборвать в таком случае выполнение запроса и продолжить дальше. |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
а ежели через fork попробовать? -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
ну можно попробовать через fork,
можно через wget на крайний случай. хотелось волшебное решение через LWP, чтобы двиг не переписывать. (тем более все должно и на винде работать, а форки в винде по моему еще хуже чем threads) |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
burakov, ну выложи более подробный код, а то по кускам все ж не до конца понятно, где и что можно изменить.
Добавлено через 40 секунд
для граббера сойдет -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
krypt3r |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: нет Всего: 16 |
Может поможет
|
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
Если у Вас коннект по https, то в LWP есть с timeout-ом баг
http://stackoverflow.com/questions/9400068...useragent-https Т.е. надо писать timeout => 5, Timeout => 5 |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Его же пофиксили давно, там даже написано. А что касается LWP, то вся соль здесь https://metacpan.org/source/GAAS/libwww-per...ol/http.pm#L128 Соответственно для реализациии dead line таймаута потребуется либо реализовать свой имплементор для http и https схемы, унаследовавшись от LWP::Protocol::http и LWP::Protoco::https сответственно и переопределив метод request. Либо переопределить LWP::Protocol::http::request напрямую monkey патчингом. |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
В обсуждении на stackoverflow.com посоветовали LWPx::ParanoidAgent, в нем реализован общий timeout().
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
ginnie, он там реализован как раз с помощью SIGALRM
Я тут придумал как это можно сделать дёшево и сердито. Делаем tied handle, который при каждом read/write проверяет а не наступил ли таймаут (прошло больше времени, чем задано). Если прошло возвращает ошибку. Далее нужно связать с этим умным handl'ом сокет, который создаёт LWP. Это можно легко сделать подменив IO::Socket::INET::new на наш со связыванием (локализовав эту подмену внутри функции, где LWP создаёт сокет). Далее тестовый скрипт, показавший, что это более менее работает. При установленном таймауте 3 секунды проходит 4. А на простом LWP все 10 (собственно столько создаваемый сервер и отдаёт контент). На винде тоже работает.
Добавлено через 3 минуты и 41 секунду ginnie, прошу прощенья. Перепутал с LWP::UserAgent::Paranoid |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Да, на моём тесте LWPx::ParanoidAgent выдал ровно 3 отведённые ему секунды. Можно рекомендовать к использованию.
|
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
посоветовали еще WGET
--connect-timeout=СЕК установка тайм-аута подключения в СЕК. --read-timeout=СЕК установка тайм-аута чтения в СЕК. попробовал
но коннект не обрывает. а это вроде все таймауты, которые у него есть. просто по идее грабер должен кроссплатформенно виндоус, линукс работать.. а под виндоусом alarm не особо на многопотоке. как то можно оборвать по таймауту wget соединение? |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
ну там еще и dns-timeout был(что-то вроде этого), хотя это наверно зависит еще и от самой оси, у меня на убунту по крайней мере что-то такое есть. В других не знаю. Но на тему wget тогда у меня вопрос - разве его винда поддерживает? -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
ну есть сборка win32, а как же.
но че то не работает обрыв (по крайней мере видно это не те таймауты) пришлось даже админа знакомого упросить смоделировать на линуксе ситуацию на моем ай пи. wget не обрывает, хотя было бы удобно его как клиента получающего контент использовать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: CGI программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |