Perl6多线程2: Promise new/keep/bread/status/result
来源于个人理解的翻译。
创建一个 promise:
my $p = Promise.new;
可以打印运行 的Promise 状态:
my $p = Promise.new();
$p.then({say 'hello, world'});
say $p.status;
上面的promise创建好后, 当 $p 状态为 kept或broken 时, 会执行 then 里面的 匿名函数。
但是, 上面的$p状态总是为: Plannd。
所以, 那个 hello, world 总是不能打印。
那怎么办呢?
Promise 有两个 函数用于更改 promise状态:
. keep
. break
可以改成这样:
my $p = Promise.new();
$p.then({say 'hello, world'});
say $p.status;
$p.keep;
say 'Result ~ '~$p.result;
结果如下:
C:\p6>perl6 scan_dir.p6
Planned
hello, world
Result ~ True C:\p6>
如果把 keep 改为 break的话, 也会让 匿名函数执行, 同时会引发一个常常:
my $p = Promise.new();
$p.then({say 'hello, world'});
say $p.status;
$p.break;
say 'Result ~ '~$p.result;
运行结果如下:
C:\p6>perl6 scan_dir.p6
Planned
hello, world
Tried to get the result of a broken Promise
in block <unit> at scan_dir.p6 line Original exception:
False
in block <unit> at scan_dir.p6 line C:\p6>
注意这里的匿名函数, 当 Promise 执行 kept或 broken 方法时, 会执行它, 最后 promise中的result方法会返回一个值, 这个返回值是传递给 keep 或 break的值或者是then返回了另一个新Promise
的result值(这个值是匿名函数的返回值):
my $p = Promise.new();
$p.then({say 'hello, world'});
say $p.status;
$p.keep('Return for Promise');
say 'Result ~ '~$p.result;
say $p.status;
结果:
C:\p6>perl6 scan_dir.p6
Planned
Result ~ Return for Promise
hello, world
Kept C:\p6>
my $p = Promise.new();
my $p1 = $p.then({ 'hello, world'});
say $p.status;
#$p.keep('Return for Promise');
$p.keep;
say 'Result ~ '~$p.result;
say $p.status;
say $p1.result;
结果:
C:\p6>perl6 scan_dir.p6
Planned
Result ~ True
Kept
hello, world C:\p6>
如果不传递参数执行 $p.keep 时, 匿名函数执行完后, 用 $p.result 会返回一个 True, 这个true 代理 原来的Promise(这里的$p)执行完毕, 状态为 kept。
这个 then 方法, 其实会自动创建一个新的Promise并返回这个Promise(这里的$p1), then方法中的匿名函数参数就是原来的Promise($p), 看如下代码:
my $p = Promise.new();
my $p1 = $p.then(-> $key { say $key.result});
#这里相当于创建了一个新的Promise并返回它
#key 其实就是 $p
$p.keep('This is $p');
#say $p.status;
sleep ;
say $p.status;
say $p1.status;
像一开始所说, Promise.new 创建一个 Promise 时, 默认是不会自动执行的,这时当我们 直接调用 $p.result 想获得 结果时, 程序会一直阻塞(因为我们没有 keep 或 bread 方法告诉这个 promise 让它运行):
my $p = Promise.new();
$p.then({say 'hello, world'});
say $p.status;
say 'Result ~ '~$p.result; #这里会一直阻塞
say 'Done'; #上面被阻塞 , 这里不会运行
那么, 我们能不能一开始创建 一个 promise 后, 让它自动去执行呢?
可以, 用 Promist.start() 方法即可。
Perl6多线程2: Promise new/keep/bread/status/result的更多相关文章
- Perl6多线程3: Promise start / in / await
创建一个Promise 并自动运行: my $p = Promise.start({say 'Hello, Promise!'}); 如果把代码改成如下, 我们会发现什么也没打印: ;say 'Hel ...
- Perl6多线程4: Promise allof / anyof
allof : 所有代码块执行完成后才退出 anyof :只要有一个代码块执行完后就马上退出 要配合 await 一起用: my $p = start {say 'a'}; ;say 'b';} ...
- Perl6多线程1 Thread : new / run
先看一个小例子: ) { #默认参数 say $name; } sub B(:name($name)) { #默认参数为 any say $name; } A(); A(); B(); B(name ...
- 异步多线程 ASP.NET 同步调用异步 使用Result产生死锁
一个方法调用了async方法,要将这个方法本身设计为async. public class BlogController : Controller { public async Task<Act ...
- 闲话Promise机制
Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js ...
- 深入理解jQuery、Angular、node中的Promise
最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...
- 细嗅Promise
读完这篇文章,预计会消耗你 40 分钟的时间. Ajax 出现的时候,刮来了一阵异步之风,现在 Nodejs 火爆,又一阵异步狂风刮了过来.需求是越来越苛刻,用户对性能的要求也是越来越高,随之而来的是 ...
- promise的学习
为了解决回调地狱的问题,所以出现了promise的设计思想. promise的三种状态: pending 等待状态 resolved 完成状态 rejected 拒绝状态 promise的三种状态,只 ...
- 多线程、多进程、协程、缓存(memcache、redis)
本节内容: 线程: a:基本的使用: 创建线程: 1:方法 import threading def f1(x): print(x) if __name__=='__main__': t=thread ...
随机推荐
- ThinkPHP的调用css,js和图片的路径
按网上的说法,在根目录下建了一个Public目录,把css,js和图片放到Public目录下,然后用__PUBLIC__/...或__ROOT__/Public/...调用.但是发现无论如何改路径都无 ...
- CPU测试--查看cpu占用率
一.使用命令adb shell top -m 10 -s cpu(-t 显示进程名称,-s 按指定行排序,-n 在退出前刷新几次,-d 刷新间隔,-m 显示最大数量),如下图: 参数含义: PID:p ...
- 【Python】python学习文件的序列化和反序列化
json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...
- UVA12583_Memory Overow
题目是很简单的队列维护的题目. 每次加入之前判断该字母是否在队列以及队列的容量是否超过k即可. #include <iostream> #include <cstdio> #i ...
- Strus默认跳转方式是请求转发 地址栏不变 与javaweb的内部转发一样
Strus默认跳转方式是请求转发 地址栏不变 与javaweb的内部转发一样
- OSPF虚连接简单配置
实验实例:<华为路由器学习指南>P715 本实例的拓扑结构如图:Area 2没有直接与骨干区域直接相连,Area 1被用作传输区域来连接Area 0与Area2.为了使Area2与骨干区域 ...
- Unity3D手游开发日记(1) - 移动平台实时阴影方案
阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影, ...
- 【learning】加权拟阵与贪心
首先.. 这篇东西的话算是一个关于拟阵部分知识的小总结,有些语言相对来说偏向便于理解方面,所以可能..有一些说法会不是那么严谨大概是这样 一些概念 线性无关:一组数据中没有一个量可以写成其余量的线 ...
- eclipse show view失效的解决办法
今天打开eclipse,发现console窗口没有了,然后使用show view也无法打开,上网查找办法,找到了方法试了一下,窗口重置(Windows-->Perspective-->Re ...
- iOS9 HTTP请求失败
iOS9把所有HTTP请求都改成了HTTPS请求,导致应用加载不出数据. 解决方法:在plist中添加以下新字段 App Transport Security Settings:Dictionary ...