Perl에서 서브 루틴 sub_info
을 만들었습니다. 따라서 Perl 스크립트에서는 입력 파일의 각 행을 읽고 sub_info 서브 루틴을 호출합니다. 그러나 일부 입력 행의 경우 sub_info는 실행하는 데 시간이 오래 걸립니다. 그래서 기본적으로 각 입력 행에 대해 sub_info 서브 루틴의 실행 시간을 계산하고 15 분 이상 걸릴 경우 해당 입력 행을 전달하고 다음 입력 행에 sub_info
서브 루틴을 실행하려고합니다. Perl에서 서브 루틴을 실행하는 시간을 계산하는 함수가 있습니까?Perl 서브 루틴이 너무 오래 걸리면 어떻게 중지시킬 수 있습니까?
2
A
답변
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 초를 초과 한 것을 알 수 있습니다.
투표를 재개하십시오. 이것은 프로파일 링에 대한 질문이 아닙니다. – mob