zoukankan      html  css  js  c++  java
  • Perl6多线程3: Promise start / in / await

    创建一个Promise 并自动运行:

    my $p = Promise.start({say 'Hello, Promise!'});

    如果把代码改成如下, 我们会发现什么也没打印:

    my $p = Promise.start({sleep 2;say 'Hello, Promise!'});

    匿名函数 sleep 2 秒, 这时, 它还没运行完, 主程序就退出了, 这里 promise也跟着退出, 所以什么也没打印。

    我们可以改写成这样:

    my $p = Promise.start({sleep 2;say 'Hello, Promise!'});
    sleep 3;

    是不是觉得有点不太好?因为你有时并不知道程序什么时候运行完成。

    记得上面说过 return 方法, 会阻塞直到 Promise完成, 可以改成这样:

    my $p = Promise.start({sleep 2;say 'Hello, Promise!'});
    $p.result;

    其实还有一个方式, 那就是:

    await

    代码可以改写成这样:

    my $p = Promise.start({sleep 3;say 'Hello, P'});
    my $p1 = Promise.start({say 'Hello, P1'});
    
    await $p;

    如果我们创建好一个 promise 后, 不想让它马上运行, 而是要让他过多少秒后再运行, 有没有办法呢?

    这时可以用:

    Promise.in

    这个 in 会在多少秒后返回一个新的 Promise, 并在这个秒数后向这个Promise($p)返回一个Kept, 使得这个Promise($p)去执行 then方法(这个then前面介绍过, 它遇到Kept/break就会自动执行):

    my $p = Promise.in(3);
    $p.then( -> $p_ {say $p.status;say 'Hello, promise.in!'});

    上面代码并不能打印, 因为主程序已退出。

    可能你想到了 await, 改写如下:

    my $p = Promise.in(3);
    $p.then( -> $p_ {say $p.status;say 'Hello, promise.in!'});
    #await $p;
    await $p;

    可以正常打印, 但有问题, 问题就是:

    这个 Promise.in会在多少秒后, 返回一个 Promise($p), 之后在自身调用 kept方法, $p看到 keep方法了, 会去调用 then, 流程就是这样。

    我们最后在等待的是: $p。

    但你想想, 这个 await 会等到 kept时就会退出, 在它退出时那个 $p.then才刚运行。 这就是问题所在。

    下面是验证代码:

    my $p = Promise.in(3);
    $p.then( -> $p_ {sleep 3;say $p.status;say 'Hello, promise.in!'});
    #await $p;
    await $p;

    我虽然 await 了, 但没能打印。因为主程序已退出了。

    上一篇已说过, $p.then 方法会返回一个新的 Promise, 我们可以在这个新的 Promise 身上调用 await 方法即可, 如下:

    my $p = Promise.in(3);
    my $p1 = $p.then( -> $p_ {sleep 3;say $p.status;say 'Hello, promise.in!'});
    #await $p;
    await $p1;

    结果如下:

    C:p6>perl6 scan_dir.p6
    Kept
    Hello, promise.in!
    
    C:p6>

    我们还可以让很多代码块一起执行, 当所有代码块执行完成后才退出, 或者其中一个代码块执行完成后就立即退出:

    1. allof
    2. anyof
  • 相关阅读:
    mysql分区
    schema设计
    MYSQL索引
    innodb事务锁
    EXTJS4.2——2.Hellow World
    什么是DOM?
    .net制作窗体
    “System.Runtime.InteropServices.COMException”/ 其他信息: ClassFactory 无法供应请求的类 (异常来自 HRESULT:0x80040111
    github下载文档并修改,上传文档
    HTML 介绍标准格式
  • 原文地址:https://www.cnblogs.com/perl6/p/7440506.html
Copyright © 2011-2022 走看看