如何在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的超时值对我们来说没有任何好处.对请求强制执行绝对超时的最佳方法是什么? 每当超时达到极限时,它就会死掉,我无法继续使用脚本! 解决方法
我在
https://stackoverflow.com/a/10318268/1331451之前遇到过类似的问题.
你需要做的是添加一个$SIG {ALRM}处理程序并使用 警报将触发信号,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为信号. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |