1

基本上我正在编写一个脚本,我需要在其中发送 HTTP 请求,并再次基于响应,可以将更多请求发送到服务器并执行操作。为了达到同样的效果,我们编写了一个可以返回LWP::UserAgent的小子程序,下面是它的代码。

sub createLWPUAObject
{
    $logger->info(
                 "Entered createLWPUAObject() - Creating LWP UserAgent Object");
    my $userAgent = LWP::UserAgent->new;
    $userAgent->timeout($httpRequestTimeout);
    $userAgent->env_proxy;
    $logger->info("Exiting createLWPUAObject() - Returning User agent Object");
    return $userAgent;
}

现在脚本的设计使得我们有多个线程级别,如果某些工作作为初始线程的一部分返回,则可以产生工作线程。由于这个原因,这些线程也可以创建 LWP::UserAgent 有时我观察到 Web 服务器主机返回 500 作为响应。当我们在报告此类错误时检查主机时,观察到大多数套接字都处于 TIME_WAIT 中,因此我们无法建立进一步的连接。

我提出的解决方案之一是,当启动工作线程时,我们只传递一个 LWP::UserAgent,该线程将在其整个生命周期中使用它,但由于父线程以更高的速率产生,我们会遇到错误。

那么我们如何创建一个 LWP::UserAgent 池,以便我可以限制连接并确保在脚本运行之前我们的套接字处于已建立模式。请注意,脚本可能需要 6-7 小时,因此我们需要确保在此期间套接字需要处于已建立模式。

4

1 回答 1

1

似乎使用 LWP::ConnCache 帮助以优雅的机制关闭连接。如前所述,我们使用 LWP::UserAgent 以某种不优雅的格式终止连接。下面是帮助我们以一种形式拥有一个连接池并重用相同连接的代码。

sub createLWPUAObject
{
    $logger->info(
                 "Entered createLWPUAObject() - Creating LWP UserAgent Object");
    my $userAgent = LWP::UserAgent->new;
    $userAgent->timeout($httpRequestTimeout);
$cache = LWP::ConnCache->new; my $num_connections = 100; 
$cache->total_capacity([$num_connections]); 
$userAgent->conn_cache($cache);
return $userAgent;
}

此外,通过细微的调整,我们可以使连接限制在线程之间保持不变。

于 2013-06-17T17:23:46.023 回答