Flutter - Dart 基础(单线程异步中任务执行顺序)

340 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

消息循环机制

在一个 Dart 应用中,所有的 Dart 代码都在 isolate 中运行。每一个 Dart 的 isolate 都有独立的运行线程,它们无法与其他 isolate 共享可变对象。在需要进行通信的场景里,isolate 会使用消息机制进行信息传递

Dart 应用开始的标志是 Main isolate 执行了 main 方法。当 main 方法执行完毕以后, Main isolate 的线程再去处理消息队列中的消息

截屏2022-06-30 下午10.30.45.png


关于 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 内部,并且微任务非常少。这是因为如果微任务非常多,就会造成事件队列排不上队,会阻塞任务队列的执行(比如用户点击没有反应的情况);

微任务队列的优先级要高于事件队列。先执行微任务队列中的任务,再执行事件队列中的任务


执行顺序

  1. Dart 的入口是 main函数,所以 main 函数中的代码会优先执行
  2. main 函数执行完后,会启动一个事件循环(Event Loop)就会启动,启动后开始执行队列中的任务
  3. 首先,会按照先进先出的顺序,执行 微任务队列(Microtask Queue)中的所有任务
  4. 其次,会按照先进先出的顺序,执行 事件队列(Event Queue)中的所有任务