【问题标题】:Perl AnyEvent throwing HTTP Error 595Perl AnyEvent 抛出 HTTP 错误 595
【发布时间】:2015-04-23 08:03:17
【问题描述】:

我一直在尝试使用 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 上工作并且它还活着。谁能指出如何调试这个问题?

【问题讨论】:

  • 如果将超时时间提高到 50 会发生什么?
  • 同样的结果!
  • 如何启动事件循环? $request 不是my-ed,它在其他地方使用过吗?如果您的代码示例实际上是一个最小的可运行脚本,这将非常有帮助。

标签: perl http asynchronous anyevent


【解决方案1】:

“连接超时”错误表示底层 tcp 连接超时。也就是说,当 AnyEvent::HTTP 尝试连接到 Web 服务器或代理时,连接请求超时(通常在大约 30 秒后)。没有办法以可移植的方式影响此超时。

具体来说,问题不是请求本身的问题(还没有进入那个阶段),也不是DNS解析的问题,也不是服务器拒绝连接的问题。问题是服务器没有响应,即它被关闭,你和服务器之间的互联网连接失败,或者防火墙默默地阻止了连接。

更新

我刚刚收到一个用户的报告,该用户由于一个稍微不同的问题而遇到了这个问题 - 他启动了一个 HTTP 请求,而不是返回到事件循环,他阻止他的程序的时间超过了超时时间(使用 @987654321 @)。换句话说,他启动了一个 HTTP 请求,然后阻止了事件库工作。当控制最终返回时,AnyEvent::HTTP 立即超时,因为它无法及时创建连接。

看到您的超时非常小,这很可能是原因 - AnyEvent::HTTP 无法知道连接超时是因为服务器/网络延迟还是因为它根本无法获得足够的 CPU 时间来执行请求在规定的时间内。

在这种情况下,解决方法是要么将超时设置得更长一些,以便即使 CPU 时间很少也有足够的时间,或者通过运行事件循环并使用计时器代替睡眠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多