2013-06-15 4 views
1

기본적으로 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 시간이 걸릴 수 있으므로 해당 기간 동안 소켓이 확정 모드 여야 함을 확인해야합니다.

+0

더 자세히 살펴보면 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

답변

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

또한 미세 조정을 통해 연결 제한을 스레드간에 일정하게 만들 수 있습니다.

관련 문제