Xpoint
   [напомнить пароль]

[LWP] Ограничить время ожидания ответа

Метки: [без меток]
2006-06-03 15:59:40 [обр] Роман Чемисов(36/350)[досье]

Такие строчки:

$req = HTTP::Request->new(GET => $url);
$res = $ua->request($req);

Почему-то иногда сервер не отвечает. И скрипт подвисает на этом месте. А таймаут не срабатывает, хотя есть:

$ua = LWP::UserAgent->new;
$ua->timeout(20);

Как быть?

спустя 1 час 24 минуты [обр] Владимир Палант(146/4445)[досье]
Вопрос уже не раз поднимался и ответа найдено не было, насколько я помню. Этот таймаут не действует, если "подвисание" происходит при попытке соединиться.
спустя 56 минут [обр] Роман Чемисов(36/350)[досье]
Владимир Палант[досье]
Понятно. И как мне теперь дальше жить?
P. S. Надо будет поискать на PerlMonks.
спустя 29 минут [обр] Владимир Палант(146/4445)[досье]
Посмотрел исходники — похоже, что проблема тут в IO::Socket, куда этот таймаут передается. То есть от нее никак не избавиться. Можно разве что форкнуться, чтобы не ждать...
спустя 3 минуты [обр] Даниэль Алиевский(3/125)[досье]
А как насчет обычного alarm? Разве не подойдет? Ставим local $SIG{ALRM} на нужную процедуру прерывания - с вызовом die - и обрамляем все LWP-вызовы eval с проверкой, не произошел ли этот die. Под Windows не сработает, но, наверно, нужно под Unix?
спустя 1 час 2 минуты [обр] Роман Чемисов(36/350)[досье]
Вот что мне удалось нарыть Problems trying to timeout LWP requests.
Даниэль Алиевский[досье]
Вы правы, это FreeBSD.
спустя 6 дней [обр] Сергей Чернышев(0/589)[досье]
Я делаю как раз alarm-ом - вполне работает.
спустя 2 часа 58 минут [обр] Роман Чемисов(36/350)[досье]
Сергей Чернышев[досье]
А на код можно взглянуть?
спустя 18 часов [обр] Сергей Чернышев(0/589)[досье]
Роман Чемисов[досье]
Код взят на прямую вот отсюда: http://perldoc.perl.org/functions/alarm.html
eval {
        local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
        alarm $timeout;
        $nread = sysread SOCKET, $buffer, $size;
        alarm 0;
};
if ($@) {
        die unless $@ eq "alarm\n";   # propagate unexpected errors
        # timed out
}
else {
        # didn't
}
Powered by POEM™ Engine Copyright © 2002-2005