https://juejin.im/post/5cc311695188252e83434aba
协程
async、await本质上就是协程的一种语法糖
协程分为无线协程和有线协程,无线协程在离开当前调用位置时,会将当前变量放在堆区,当再次回到当前位置时,还会继续从堆区中获取到变量。有线协程则会将变量继续保存在栈区,在回到指针指向的离开位置时,会继续从栈中取出调用。async、await就属于无线协程的一种
async、await原理
以async、await为例,协程在执行时,执行到async则表示进入一个协程,会同步执行async的代码块。async的代码块本质上也相当于一个函数,并且有自己的上下文环境。当执行到await时,则表示有任务需要等待,CPU则去调度执行其他IO,也就是后面的代码或其他协程代码。过一段时间CPU就会轮询一次,看某个协程是否任务已经处理完成,有返回结果可以被继续执行,如果可以被继续执行的话,则会沿着上次离开时指针指向的位置继续执行,也就是await标志的位置。
Future的执行顺序由加入事件循环队列的顺序决定
Dart的事件循环和异步操作
https://dart.dev/articles/archive/event-loop
两种事件队列
both-queues.pngFuture与两种事件队列的关系
- 传递给Future的then()方法的函数在Future完成时立即执行。(该函数未入队,只是被调用。)
- 如果在调用then之前已经完成了Future ,那么就会在Microtask队列中添加一个任务,该任务执行传递给then()的函数。
- Future()和Future.delayed()创建的Future不立即完成; 任务被添加到Event队列。
- 所述Future.value()生成的Future在microtask队列中执行。
- 该Future.sync()构造函数立即执行其功能参数(除非该函数返回一个Future),在microtask队列。
网友评论