【发布时间】:2013-06-12 04:31:26
【问题描述】:
基本上,我正在编写一个脚本,我需要在其中发送 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 小时,因此我们需要确保在此期间套接字需要处于已建立模式。
【问题讨论】:
-
进一步查看后,我发现 LWP::ConnCache 根据 Perl Doc 提供连接缓存机制 use LWP::ConnCache; $browser->conn_cache(LWP::ConnCache->new()):这告诉浏览器对象尝试使用 HTTP/1.1 “保持活动”功能,该功能通过对多个请求重用相同的套接字连接来加速请求同一台服务器。 所以我更新了我的代码,如下
my $cache = LWP::ConnCache->new; my $num_connections = 100; $cache->total_capacity([$num_connections]); $userAgent->conn_cache($cache);那么这是实现池的正确方法吗?
标签: perl lwp lwp-useragent