持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
消息循环机制
在一个 Dart 应用中,所有的 Dart 代码都在 isolate 中运行。每一个 Dart 的 isolate 都有独立的运行线程,它们无法与其他 isolate 共享可变对象。在需要进行通信的场景里,isolate 会使用消息机制进行信息传递
Dart 应用开始的标志是 Main isolate 执行了 main 方法。当 main 方法执行完毕以后, Main isolate 的线程再去处理消息队列中的消息
关于 isolate
Dart 是单线程的,主要通过 main isolate 运行。但是对于多核 CPU 来说,是一种资源的浪费。如果在开发中,有耗时的业务,完全可以自己创建 isolate,在独立的 isolate 中完成需要的耗时业务
创建单独的 isolate
import "dart:isolate";
main(List<String> args) {
Isolate.spawn(foo, "Hello Isolate");
}
void foo(info) {
print("新的isolate:$info");
}
事件队列
在 Dart 中,有一个事件循环(Event Loop)执行代码,里面存在一个事件队列(Event Queue),事件循环不断从事件队列中取出事件并执行
事件队列的分类
在 Dart 中其实有俩个队列
-
事件队列(Event Queue)
所有的外部事件任务都在事件队列中,如IO、计时器、点击、以及绘制事件等
-
微任务队列(Microtask Queue)
微任务通常来源于 Dart 内部,并且微任务非常少。这是因为如果微任务非常多,就会造成事件队列排不上队,会阻塞任务队列的执行(比如用户点击没有反应的情况);
微任务队列的优先级要高于事件队列。先执行微任务队列中的任务,再执行事件队列中的任务
执行顺序
- Dart 的入口是
main
函数,所以main
函数中的代码会优先执行 main
函数执行完后,会启动一个事件循环(Event Loop)就会启动,启动后开始执行队列中的任务- 首先,会按照先进先出的顺序,执行 微任务队列(Microtask Queue)中的所有任务
- 其次,会按照先进先出的顺序,执行 事件队列(Event Queue)中的所有任务