기본적으로 HTTP 요청을 보내야하는 스크립트를 작성 중이며 응답을 기반으로 더 많은 요청을 서버에 보내고 작업을 수행합니다. 이를 달성하기 위해 아래에 LWP::UserAgent을 반환 할 수있는 작은 서브 루틴이 작성되었습니다.Perl의 스레드 풀을 사용하는 방법이 필요합니다. 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를 만들 수도 있으므로 언젠가 웹 서버 호스트가 응답으로 500을 반환한다는 것을 알게되었습니다. 이러한 오류가보고 될 때 호스트를 확인할 때 소켓이 대부분 TIME_WAIT에 있었기 때문에 추가 연결을 설정할 수 없기 때문에 관찰되었습니다.
우리가 작업자 스레드가 시작될 때마다 우리는 하나의 LWP :: UserAgent 만 전달합니다.이 스레드는 전체 스레드 수명 동안 사용되지만 부모 스레드는 더 높은 속도로 생성됩니다. 오류가 발생했습니다.
그래서 우리는 LWP :: UserAgent 풀을 만들어서 연결을 제한 할 수 있으며 스크립트가 실행될 때까지 소켓이 Established 모드에 있는지 확인할 수 있습니다. 스크립트는 6-7 시간이 걸릴 수 있으므로 해당 기간 동안 소켓이 확정 모드 여야 함을 확인해야합니다.
더 자세히 살펴보면 Perl Doc 당 연결 캐싱 메커니즘을 제공하는 LWP :: ConnCache를 발견했습니다. ** LWP :: ConnCache 사용; $ browser-> conn_cache (LWP :: ConnCache-> new()) : 브라우저 객체에 HTTP/1.1 "Keep-Alive"기능을 사용하도록 요청합니다.이 기능은 여러 요청에 대해 동일한 소켓 연결을 재사용하여 요청 속도를 높입니다. ** 그래서 아래 코드와 같이 코드를 업데이트했습니다. 'my $ cache = LWP :: ConnCache-> new; my $ num_connections = 100; $ cache-> total_capacity ([$ num_connections]); $ userAgent-> conn_cache ($ cache); ' 이렇게 수영장에 적합한 방법입니다. – Abhinav