创建一个Promise 并自动运行:

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

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

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

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

我们可以改写成这样:

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

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

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

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

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

await

代码可以改写成这样:

my $p = Promise.start({sleep ;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();
$p.then( -> $p_ {say $p.status;say 'Hello, promise.in!'});

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

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

my $p = Promise.in();
$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();
$p.then( -> $p_ {sleep ;say $p.status;say 'Hello, promise.in!'});
#await $p;
await $p;

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

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

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

结果如下:

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

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

. allof
. anyof

Perl6多线程3: Promise start / in / await的更多相关文章

  1. Perl6多线程4: Promise allof / anyof

    allof   : 所有代码块执行完成后才退出 anyof :只要有一个代码块执行完后就马上退出 要配合 await 一起用: my $p = start {say 'a'}; ;say 'b';} ...

  2. Perl6多线程2: Promise new/keep/bread/status/result

    来源于个人理解的翻译. 创建一个 promise: my $p = Promise.new; 可以打印运行 的Promise 状态: my $p = Promise.new(); $p.then({s ...

  3. node.js异步控制流程 回调,事件,promise和async/await

    写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...

  4. Promise, Generator, async/await的渐进理解

    作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...

  5. promise.then, setTimeout,await执行顺序问题

    promise.then VS setTimeout 在chrome和node环境环境中均输出2, 3, 1, 先输出2没什么好说的,3和1顺序让人有些意外 原因: 有一个事件循环,但是任务队列可以有 ...

  6. 异步操作之 Promise 和 Async await 用法进阶

    ES6 提供的 Promise 方法和 ES7 提供的 Async/Await 语法糖都可以更好解决多层回调问题, 详细用法可参考:https://www.cnblogs.com/cckui/p/99 ...

  7. Promise及Async/Await

      一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...

  8. callback vs async.js vs promise vs async / await

    需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...

  9. Perl6多线程1 Thread : new / run

    先看一个小例子: ) { #默认参数 say $name; } sub B(:name($name)) { #默认参数为 any say $name; } A(); A(); B(); B(name ...

随机推荐

  1. mysql流程控制语句

    mysql编程 mysql编程中语句块包含符: 其实就是相当于js或php中大括号语法: [标识符:]begin //语句.... end  [标识符]: 标识符就是定义定义的任意的名字而已,比如: ...

  2. js中如何获取页面的Url,域名和端口号

    有时候通过获取上个页面的Url来做一个跳转,获取域名防止非正常访问 获取上一个页面的一个URL,这个URL一般做一个页面的跳转 window.location.href <script>w ...

  3. IPv4编址及子网划分

    在讨论IP编址之前,我们需要讨论一下主机与路由器连入网络的方法.一台主机通常只有一条链路链接到网络:当主机中的IP想发送一个数据报时,它就在链路上发送,主机与物理链路之间的边界叫做接口(interfa ...

  4. 【C++】C++函数重载的总结

    函数重载: 出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(overloaded function).一定要注意函数重载的两个关键词:形参列表和作用域. 任何程序有且仅有 ...

  5. HDU——1788 Chinese remainder theorem again

    再来一发水体,是为了照应上一发水题. 再次也特别说明一下,白书上的中国剩余定理的模板不靠谱. 老子刚刚用柏树上的模板交上去,简直wa出翔啊. 下面隆重推荐安叔版同余方程组的求解方法. 反正这个版本十分 ...

  6. ZOJ3113_John

    这个题目是一个典型的Anti_Sg.我也不知道为什么这么叫,呵呵,反正大家都这么叫,而且我也是听别人说,看别人的日志自己才知道的. 题目的意思是给你不同颜色的石子,每次可以去一种颜色的石子若干个(至少 ...

  7. jmeter同步定时器

    同步定时器是jmeter中一个比较重要的定时器,同步定时器,相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起并发,可以用来做大数据量的并发请求. 验证 ...

  8. C++解析(19):函数对象、关于赋值和string的疑问

    0.目录 1.函数对象 2.重载赋值操作符 3.string类 4.小结 1.函数对象 编写一个函数: 函数可以获取斐波那契数列每项的值 每调用一次返回一个值 函数可根据需要重复使用 实现功能: #i ...

  9. python中括号的使用

    1. 列表list是用[ ]包住的以逗号分隔的数据集合 所有对列表的解析均采用[ ],不论是元素引用或取值 [ ]表示空列表 2. 字典由键-值(key-value)对构成,一般可采用{ }表示 取字 ...

  10. window上安装elasticserach

    提供一个百度云链接下载elasticsearch (链接:https://pan.baidu.com/s/1sk8PYjV 密码:l586) 测试达到目的:安装elasticsearch后再安装hea ...