博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dart 异步事件执行流程分析(二)
阅读量:6368 次
发布时间:2019-06-23

本文共 1409 字,大约阅读时间需要 4 分钟。

// use two list to test the async envet exe order.
// one record the emitted order;
// and the other record the captured order;
import 'dart:math';

 

final rnd = Random();
final seed = 10;
final emitted = <int>[];
final captured = <int>[];

 

main() {
capture();
Future.delayed(Duration(seconds: 50), () { // to wait capture() over
print(isEqual(emitted, captured));
print(emitted);
print(captured);
});
}

 

void capture() async {
for (var i = 0; i < 5; i++) {
  
// captured.add(await emit());
  emit().then((n) => captured.add(n));
  }
}

 

Future<int> emit() async {
var n = rnd.nextInt(seed);
emitted.add(n);
await Future.delayed(Duration(seconds: n));
return n;
}

 

bool isEqual(List<int> a, List<int> b) {
if (a.length != b.length) return false;
for (var i = 0; i < a.length; i++) {
  if (a[i] != b[i]) return false;
}
return true;
}

蓝色的两行代码:
  
// captured.add(await emit());
  emit().then((n) => captured.add(n));
如果注释掉下面一行,执行上面一行,则两个list:emitted and captured的结果是一致的。await 起到了每一次emit的等待作用,代码顺序执行,但花费的总时间是串行的总时间之和,即O(Σ(n));
 
但如果把上面一行注释掉,执行下面一行,则两个list的结果就是不同的。因为在下面一行then的回调中,经过测试发现,dart的异步 event loop不是顺序执行的。比如例子中5次emit(),根据生产的随机数delay,则随机delay时间最短的任务先完成,先调用在then()函数中注册的回调函数,因此captured中添加元素的顺序就和emit()发射的不一致,花费的时间是最大的delay的时间,即O(max(n))。output 如下:

false

[2, 6, 1, 7, 4]
[1, 2, 4, 6, 7]
Exited

 

因此对于大型多次的异步IO操作来说,恰当的使用then要比await高效的多。

 

吐槽,为什么每次代码粘贴后格式都乱了啊,还得重新格式化。

转载于:https://www.cnblogs.com/pacific/p/10159562.html

你可能感兴趣的文章
LinkedList实现队列和堆栈的代码
查看>>
微信群红包
查看>>
雨燕框架一次服务调用过程
查看>>
使用POI操作EXCEl
查看>>
面试自我介绍
查看>>
TC++PL's Advices(1)
查看>>
Java核心技术 卷1 基础知识-第一天
查看>>
iOS开发-进程与线程概念以及iOS的三种多线程技术
查看>>
Java中的HashMap 浅析
查看>>
2016-11-30
查看>>
app store 增量更新
查看>>
词霸英语积累
查看>>
位运算符——管理事务的开关状态
查看>>
Java日志组件1---Jdk自带Logger(java.util.logging.Logger)
查看>>
php 与 ajax 获取123的案例
查看>>
PHP2014.5.14的总结:
查看>>
如何成为Python高手[转]
查看>>
读《人月神话》有感2
查看>>
安装并解决purcell/emacs.d网络问题
查看>>
趋势科技:微软已修复IE7的最新安全漏洞
查看>>