在 Perl 6 中设置超时

作者: 焉知非鱼 | 来源:发表于2018-04-13 11:36 被阅读18次

    在 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 万,但这是另一回事了。)

    相关文章

      网友评论

        本文标题:在 Perl 6 中设置超时

        本文链接:https://www.haomeiwen.com/subject/yflckftx.html