我正在尝试使用Perl对远程服务器进行POST。我正在使用闹钟设置硬超时。当警报触发时,我得到了我认为是奇怪的行为。
这是代码:
eval {
local $SIG{ALRM} = sub {
die("Foobar");
};
alarm 25;
my $userAgent = new LWP::UserAgent( keep_alive => 1 );
$answer = $userAgent->post( ... );
# During a timeout, I expect that this code will not run. However,
# it does and it prints "Foobar".
$m = $answer->message();
print $m;
alarm 0;
};
alarm 0;
print "Done";
在服务器上放置一个睡眠(或断点),因此它不会响应,因此会触发警报。当警报触发时,将打印:
Foobar
Done
我的期望是应打印:
Done
关键问题:
为什么会这样?我使用某种反模式吗?使用警报,不是一个好主意,因为底层库也可能使用它们,它们可能会发生冲突吗?
解决此问题的正确方法是什么?
我知道我应该使用:
$userAgent->timeout( ... );
实际上,我是。但是,我也想设置一个硬超时,这样我就可以确保最多花25秒等待请求。由于每次客户端从服务器返回某些内容时都会重置与$userAgent->timeout( ... );
关联的超时,因此它不够可靠。
OS:
cat /etc/redhat-release
CentOS release 6.6 (Final)
Perl版本:
This is perl, v5.6.1 built for i686-linux