如何强制在Perl明确超时?(How to enforce a definite timeout i

2019-08-20 21:53发布

我使用的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文件。 我真的很想妥善处理这一超时,使脚本继续下一个地址。 有谁知道如何做到这一点? 谢谢!!

Answer 1:

我在以前遇到过类似的问题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
}
  • perlipc的信号。


Answer 2:

在一般情况下,你可以使用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函数



文章来源: How to enforce a definite timeout in perl?