我一直试图用下面的代码使用Perl AnyEvent HTTP模块发出异步请求。
my $headers = {
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language'=> 'en-us,en;q=0.5',
'Connection' => 'keep-alive'
};
$request = http_request (
GET => "$url",
timeout => 5, # seconds
# persistent => 1,
# keepalive => 1,
headers => $headers,
proxy => $proxyRef,
sub {
my ($body, $hdr) = @_;
}
);我一直从请求中得到以下答复:
{
'Reason' => 'Connection timed out',
'URL' => 'url requested',
'Status' => 595
};我一直在检查AnyEvent文档中出现此错误的原因,但没有成功。在这个问题上找不到其他有用的线程,除了建议重新尝试超时,这会产生相同的结果。一个简单的'wget‘在同一个URL上工作,并且它是活动的。有人能指出如何调试这个问题吗?
发布于 2013-12-29 00:10:02
“连接超时”错误表示基础tcp连接超时。也就是说,当AnyEvent::HTTP试图连接到web服务器或代理时,连接请求就会超时(通常在大约30秒之后)。没有办法可以移植地影响这个超时。
具体来说,这个问题不是请求本身的问题(该阶段尚未输入),也不是DNS解析,也不是服务器拒绝连接的问题。问题是服务器没有回答,即关闭它,您和服务器之间的internet连接失败,或者防火墙静默地阻止连接。
更新
我刚收到一个用户的报告,他遇到了这个问题,因为一个稍微不同的问题-他启动了一个HTTP请求,而不是返回到事件循环,他阻止了他的程序超过超时时间(使用sleep)。换句话说,他启动了一个HTTP请求,然后阻止事件库工作。当控件最终返回时,AnyEvent::HTTP立即超时,因为它无法及时创建连接。
考虑到超时非常小,这很可能是原因- AnyEvent::HTTP无法知道连接超时是由于服务器/网络延迟,还是因为它无法在所需时间内获得足够的CPU时间来执行请求。
在这种情况下,修复方法是将超时时间简化为更长的时间,这样即使CPU可用的时间很少,也会有足够的时间,或者通过运行事件循环和使用计时器而不是睡眠来重构要以基于事件的方式编写的程序。
https://stackoverflow.com/questions/18415829
复制相似问题