仅当前一个功能尚未结束且时间结束时才可以执行人员 类似的东西:
my $timeout = 10; # seconds
sub get_entities {
# do staff ...
}
get_entities();
if (time == $timeout and get_entities is not over yet) {
# do staff...
}
答案 0 :(得分:5)
你试过这个吗?
my $start = time;
get_entities();
my $duration = time - $start;
或者您正在寻找更复杂的东西吗?
答案 1 :(得分:3)
您的编辑使问题变得更加复杂。
我确信你会知道 - 作为一个标准,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秒超时,而不是第一次。但这也许有用。