需要一种方法来拥有Perl LWP :: UserAgent的线程池

时间:2013-06-15 18:50:16

标签: perl lwp lwp-useragent

基本上我正在编写一个脚本,我需要发送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模式。

1 个答案:

答案 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;
}

同样通过微调,我们可以使连接限制在线程之间保持不变。