加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:20:28 所属栏目:大数据 来源:网络整理
导读:我正在使用LWP从网页下载内容,我想限制等待页面的时间. my $ua = LWP::UserAgent-new;$ua-timeout(10);$ua-env_proxy;$response = $ua-get("http://XML File");$content = $response-decoded_content; 问题是服务器偶尔会死锁(我们试图找出原因)并且请求永远
我正在使用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为信号.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读