답변
편집하면 질문이 상당히 복잡해집니다.
표준으로 perl은 순차적으로 실행됩니다. 명령에 25 초가 걸리면 나머지 코드는 준비 될 때까지 기다립니다.
하지만 때로는 여러 가지 이유로 시간 초과를 직접 작성하려고합니다. 당신이 할 수있는 여러 가지 방법이있다 :
alarm
그리고 당신은 당신이 당신의 핸들러 내에서 수행 할 수있는 작업을 제한하고 신호 처리기
#!/usr/bin/env perl
use strict;
use warnings;
$SIG{'ALRM'} = \&handle_alarm;
my $we_are_snoozing = 1;
sub handle_alarm {
print "Caught SIGALRM\n";
$we_are_snoozing = 0;
}
sub have_a_snooze {
while ($we_are_snoozing) {
print "Zzzz\n";
sleep 10;
}
}
alarm 25;
have_a_snooze;
print "Done\n";
는 - 최소한의 유지. 그러나 alarm
은 SIGALRM
(kill
으로 생성 될 수도 있음)을 생성하며 프로세스가이를 처리하고 처리 할 수 있습니다.
threads
스레드는 병렬로 또는 비동기 적으로 실행하는 코드의 일부를 분사 할 수 있습니다. 이 기능은 두 가지 리소스 사용 모두에 유용하지만 무기한 대기 할 가치가없는 것에 직면 할 때도 유용합니다.
#!/usr/bin/env perl
use strict;
use warnings;
use threads;
use threads::shared;
my $we_are_snoozing : shared;
$we_are_snoozing = 1;
sub have_a_snooze {
while ($we_are_snoozing) {
print "Zzzz\n";
sleep 10;
}
}
my $thr = threads -> create (\&have_a_snooze);
sleep 5;
if ($thr -> is_joinable) {
print "Thread exited normally\n";
$thr -> join;
}
else {
print "Thread still running, detaching it\n";
$we_are_snoozing = 0;
$thr -> detach;
}
IO::Socket
및 타임 아웃을 원하는에 대한 일반적인 이유
한 can_read
, 단순히 IO를 기다리고 있습니다.
이 IO::Socket
와 타임 아웃 처리하기 매우 쉽습니다 :
#!/usr/bin/env perl
use strict;
use warnings;
my $pid = open (my $input, '-|', "some_command");
my $select = IO::Select -> new ($input);
while ($select -> can_read(10)) {
my $line = <$input>;
print $line;
}
이 처음되지는 마지막 결과 후 10 초 시간 초과됩니다. 그러나 그것은 유용 할 수도 있습니다.
는 당신이 봤어?
my $start = time;
get_entities();
my $duration = time - $start;
아니면 더 정교한 것을 찾고 계셨습니까?
'더 정교한'- '경보'를 찾고 신호 처리기가 대답 일 수 있습니다. – Sobrique
@Dave Cross 더 정교하고, 내 질문을 편집하여 webhook에서 작업 중입니다. – Firefly
또한 더 세밀한 타이밍이 필요한 경우 Time :: HiRes가 유용 할 수 있습니다. – user3243135
유닉스 또는 Windows? – stevieb
시스템은 유닉스입니다 – Firefly
get_entities()가 다음 명령문에 도달 할 때 완료되지 않는 단일 스레드 프로그램에는 방법이 없습니다. – user3243135