基本上我正在编写一个脚本,我需要发送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池,以便我可以限制连接,并确保我们将套接字设置为Established模式,直到脚本运行。 请注意,脚本可能需要6-7个小时,因此我们需要确保套接字在此期间需要处于Established模式。
答案 0 :(得分: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;
}
同样通过微调,我们可以使连接限制在线程之间保持不变。