追求真空
追求真空 编程-学习-思考

Dart 语言学习笔记(三)

Dart 语言学习笔记(三)

异步编程特性是每一个语言都需要支持的,那么我们现在就来看看Dart中是如何处理的。

老实说,Dart和我之前接触过的语言很不同,除了基本类型、基本流程之外其他的都不太一样,包括异步编程。当我知道Dart是单线程的时候,就很疑惑那么在Dart中是怎么实现异步的呢?在这之前,我们还是先来了解一下Dart程序的执行过程是怎样的。

其他程序C/C++也好,Java也好,都是有一个主线程,然后使用特定的方法去创造一个新的线程,来处理IO、网络请求等其他工作。然而,在Dart中不是这种运行方式,在Dart中是以任务来表示运行单元的,在一个任务队里用FIFO的方式一个一个的执行,这就是EventLoop和MicroTask队列:

  1. 首先初始化连个队列:MicroTask和EventLoop,
  2. 然后执行main()里面的所有方法函数,
  3. 最后执行 EventLoo 里面的任务。

MicroTask 队列

MicroTask 队列用于执行很短的异步任务,不过到现在我都不太明白这个是怎么使用的,可能我现在遇到的情况都很简单吧。因为MicroTask都是在EventLoop之前执行,因此它一般用于在EventLoop任务之前需要执行的任务比如资源的释放。一般使用 scheduleMicroTask() 创建一个task。

EventQuene

这个是Dart中最主要的异步实现方式,可以用在如下场景中:

  • I/O
  • 手势
  • 定时器
  • Stream 和 Future

毫无疑问,在Dart中 Future 是实现异步的方式,因为 Future 事件讲会自动加入 EventLoop 中,好了那么现在就来看看 Dart 是如何执行任务的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    +--------+    
    | main() |
    +--------+
        ||<---------------------------------------------+
        ||<----------------------------------------+    |    
        \/                                         |    |
  +-------------+                                  |    |
  | MicroTask() |    no   +-------------------+    |    |
  |  Empty ?    | ------->| Run Next microtask|----+    |
  +-------------+         +-------------------+         |
        ||                                              |
        || yes                                          |
        \/                                              |
  +-------------+                                       |    
  | EventLoop() |    no    +------------------+         |
  |  Empty ?    | -------->| Handle next event|---------+
  +-------------+          +------------------+ 
        ||
        || yes
        \/
    +--------+    
    | exit() |
    +--------+

好了,上图就是Dart中任务执行的基本顺序了。就是首先执行main()中的任务,然后就是再把MicroTask队列中的任务执行完毕,之后就是EventLoop中的。在两个队列之间如果有新的任务会自动添加到任务队列的队尾,从而循环执行。

好了,今天已经了解了 Dart 主线程的运行过程,下一次就了解一下 Future async await 等关键字的使用和对EventLoop的影响…