在 Raku 中设置超时

Setting timeouts in Raku

在 Raku 中设置超时

在 Perl 5 中,我曾经使用信号设置超时(至少,这是一种简单且可预测的方式)。在 Raku 中,您可以使用 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 raku 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 万,但这是另一回事了。)

comments powered by Disqus