2012-04-25 3 views
-1

다음 코드의 메모리 소비는 실행 과정에서 증가합니다. 무엇이 잘못 될 수 있습니까? 쓰레드에서 완전히 빠져 나오기 위해해야 ​​할 일이 있습니까? 대부분의 시스템, 빈번하고 지속적인 창조와 스레드의 파괴 그냥 스레드를 실행하는 간단하지만. 펄 인터프리터의 메모리 풋 프린트 성장을 계속 증가로 이어질 수에 http://perldoc.perl.org/threads.htmlPerl 스레드에서 완전히 종료하십시오.

"에서

#!/usr/bin/perl -w 
use strict;  

my ($i,$URL); 
my @Thread; 
my $NUM_THREADS=4; 
my @response:shared =(); 
while(1) 
{ 
    for($i=0;$i<$NUM_THREADS;$i++) 
    { 
     if($response[$i] is processed) 
     { 
       $URL=FindNextURL(); 
       $Thread[$i]=new threads \&Get,$i,$URL; 
       $Thread[$i]->detach(); 
     } 
    } 
    # wait for atleast one $response[$i] 
    # if ready process it    
} 

sub Get 
{ 
    my $i=$_[0]; 
    my $URL=$_[1];   
    $response[$i]=FetchURL($URL); 
    return; 
} 
+0

당신은 전체 변수를 가지고 있고 스파게티 코드에 무엇을 말할 수 있습니다. 멋진 것을 시도하기 전에 먼저 코드의 이러한 측면을 다스리려고합니다. –

+0

@response라는 전역 변수가 하나뿐입니다. 전역 변수를 사용하지 않는 다른 모든 메소드는 환영합니다. – Jean

+0

'$ i','@ Thread' 및'$ URL'도 전역 변수입니다. –

답변

2

그리고 나서 -> join() 또는 -> detach()를 사용하여 수명이 긴 응용 프로그램 인 스레드 풀을 유지하고 대기열을 사용하여 대기중인 작업을 스레드에 알리는 작업에 다시 사용하는 것이 좋습니다. 이 모듈의 CPAN 배포판에는 재사용 가능한 스레드 풀 생성, 사용 및 모니터링을 보여주는 간단한 예제 (examples/pool_reuse.pl)가 들어 있습니다. "

스레드 설문 조사를 시도해보십시오.

관련 문제