在 Perl 6 中设置超时
在 Perl 5 中,我曾经使用信号设置超时(至少,这是一种简单且可预测的方式)。在 Perl 6 中,您可以使用 promise。让我们看看如何做到这一点。
要模仿长时间运行的任务,请创建一个无限循环,然后打印其状态。开始吧:
for 1 .. * {
.say if $_ %% 100_000;
}
只要循环得到控制,它将永远不会退出。我们的任务是在几秒钟内停止程序,因此计时器应在循环之前设置:
Promise.in(2).then({
exit;
});
for 1 .. * {
.say if $_ %% 100_000;
}
在这里,Promise.in
方法创建一个 promise,在给定秒数后自动 kept。在 promise 的基础上,使用 then
,我们添加了另一个 promise,其代码将在超时后运行。这里唯一的语句就是退出,停止主程序。
运行该程序以查看它的工作原理:
$ time perl6 timeout.pl
100000
200000
300000
. . .
3700000
3800000
3900000
real 0m2.196s
user 0m2.120s
sys 0m0.068s
该程序在我的计算机上计数达四百万,并在两秒内退出。这正是我们需要的行为。
为了比较,下面是实现同样功能的 Perl 5 程序:
use v5.10;
alarm 2;
$SIG{ALRM} = sub {
exit;
};
for (my $c = 1; ; $c++) {
say $c unless $c % 1_000_000;
}
(它设法计数高达 4000 万,但这是另一回事了。)
网友评论