Просто тестируя его сейчас на https://www.sourceforge.net/, у меня сложилось впечатление, что Аргумент timeout действительно работает, но он не работает до тех пор, пока не произойдет согласование HTTPS. Я установил очень низкое значение тайм-аута, дробное значение, и он правильно сообщает о тайм-ауте, но задержка намного больше, чем мое значение тайм-аута, а затем он сразу же возвращается с ошибкой тайм-аута.
Пример:
#!/usr/bin/perl
use strict;
use warnings;
$|=1;
# This "works", downloading the page within the timeout period
use WWW::Mechanize;
my $mech = WWW::Mechanize->new(
timeout => 3,
);
$mech->get( 'https://www.sourceforge.net/' );
print "Successful get.\n";
# This throws a connect timeout, but after a delay much longer than 50ms
my $mech2 = WWW::Mechanize->new(
timeout => 0.05,
);
$mech2->get( 'https://www.sourceforge.net/' );
print "Successful get 2.\n";
Вывод:
Successful get.
Error GETing http://sourceforge.net/: Can't connect to sourceforge.net:80
(connect: timeout) at ./throwaway22855.pl line 20
Похоже, тайм-аут обрабатывается глубоко внизу в IO::Socket, используя select
. В некоторых системах это может мешать работе SIGALRM
, поэтому, если вы хотите обойти это и написать свой собственный тайм-аут, обязательно прочитайте документацию по реализации вашей платформы. Также обратите внимание (в perldoc perlipc
), что Perl использует отложенные сигналы, начиная с 5.8.x, поэтому установка сигнала тревоги вручную может не работать без использования обходного пути sigprocmask
.
Здесь есть дополнительная информация: Timeout SIGALRM -- Как влияет ли это на существующие операции?
person
Sdaz MacSkibbons
schedule
06.03.2011