如何在perl中强制执行明确的超时?

前端之家收集整理的这篇文章主要介绍了如何在perl中强制执行明确的超时?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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调用它.您可以在拨打电话之前设置闹钟,然后直接取消闹钟.然后你可以看看你回来的HTTP :: Result.

警报将触发信号,Perl将调用信号处理程序.在它里面,你既可以直接做东西也可以死去或者死去.评估是为了让模具不破坏整个程序.如果调用信号处理程序,则会自动重置警报.

你也可以给处理程序添加不同的骰子消息,然后在@答案中说@lars之类的$@来区分.

这是一个例子:

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为信号.

猜你在找的Perl相关文章