2015-01-22 2 views
2

Perl에서 서브 루틴 sub_info을 만들었습니다. 따라서 Perl 스크립트에서는 입력 파일의 각 행을 읽고 sub_info 서브 루틴을 호출합니다. 그러나 일부 입력 행의 경우 sub_info는 실행하는 데 시간이 오래 걸립니다. 그래서 기본적으로 각 입력 행에 대해 sub_info 서브 루틴의 실행 시간을 계산하고 15 분 이상 걸릴 경우 해당 입력 행을 전달하고 다음 입력 행에 sub_info 서브 루틴을 실행하려고합니다. Perl에서 서브 루틴을 실행하는 시간을 계산하는 함수가 있습니까?Perl 서브 루틴이 너무 오래 걸리면 어떻게 중지시킬 수 있습니까?

+0

투표를 재개하십시오. 이것은 프로파일 링에 대한 질문이 아닙니다. – mob

답변

2

아마 SIG{ALRM}alarm의 조합으로 갈 것 :

use warnings; 
use strict; 

$|=1; 

for my $i (1 .. 10) { 

    local $SIG{ALRM} = sub { 
    die; 
    }; 

    eval { 
    alarm 5; 
    sub_info($i); 
    }; 

    if ([email protected]) { 
    print "aborted\n"; 
    } 
    alarm 0; 
} 

sub sub_info { 
    my $i = shift; 
    my $r = int(10*rand); 

    printf "Trying %2d for %2d seconds: ", $i, $r; 
    sleep $r; 
    print "finished\n"; 
} 

alarm n 사용하면 n초 후 SIGALRM 신호가 호출 프로세스에 전달되도록 지정합니다. 프로세스가 이러한 신호를 수신하면 $SIG{ALRM}에 지정된 작업을 수행합니다. 위의 샘플 스크립트에서는 방금 죽습니다.

sub_info 호출에 걸리는 시간이 5 초 미만이면 die이 호출되지 않지만 더 많은 시간이 걸리면 die이 호출됩니다.

전체 프로세스가 죽는 것을 원하지 않으므로 sub_info에 대한 호출을 eval 블록으로 래핑합니다. eval 블록이 종료되면 [email protected]이 설정됩니다. 따라서 [email protected]에서 실제 값을 확인하면 5 초를 초과 한 것을 알 수 있습니다.

관련 문제