我使用的LWP下载从网页上的内容,我想限制的时间等待一个页面的数量。
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;
$response = $ua->get("http://XML File");
$content = $response->decoded_content;
问题是,服务器偶尔会死锁(我们试图找出原因),并请求将不会成功。 由于服务器认为它是活的,它保留了套接字连接打开从而LWP :: UserAgent的的超时值确实我们没有什么好那么远。 什么是强制执行的请求超时绝对的最佳方法是什么?
每当超时达到其极限时,它只是死了,我无法继续与脚本! 这整个脚本是在一个循环中,它具有获取顺序XML文件。 我真的很想妥善处理这一超时,使脚本继续下一个地址。 有谁知道如何做到这一点? 谢谢!!
我在以前遇到过类似的问题https://stackoverflow.com/a/10318268/1331451 。
你需要做的就是添加一个$SIG{ALRM}
处理程序,并使用alarm
调用它。 您可以设置alarm
你做的呼叫,并取消其直接事后之前。 然后你可以看一下HTTP ::结果你回来。
报警将触发信号和Perl将调用信号处理程序。 在这里面,你可以直接做的东西和die
或刚die
。 该eval
对于die
没有打破整个程序。 如果信号处理函数被调用时, alarm
将自动复位。
你也可以添加不同的die
到处理器的消息,并区分以后$@
像@larsen他回答说。
下面是一个例子:
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new;
my $res;
eval {
# custom timeout (strace shows EAGAIN)
# see https://stackoverflow.com/a/10318268/1331451
local $SIG{ALRM} = sub {
# This is where it dies
die "Timeout occured...";
}; # NB: \n required
alarm 10;
$res = $ua->request($req);
alarm 0;
};
if ($res && $res->is_success) {
# the result was a success
}
在一般情况下,你可以使用eval
如果你要的代码陷阱和控制部分,可能死块。
while( … ) { # this is your main loop
eval {
# here the code that can die
};
if ($@) {
# if something goes wrong, the special variable $@
# contains the error message (as a string or as a blessed reference,
# it depends on how the invoked code threats the exception.
}
}
您可以在文档中进一步信息的eval函数