При тестировании сейчас с https://www.sourceforge.net/, создается впечатление, что аргумент тайм-аута работает , но не работает до тех пор, пока не произойдет согласование 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
.
Здесь есть дополнительная информация:
Тайм-аут SIGALRM - Как это влияет на существующие операции?