Dart 语言学习笔记(三)
异步编程特性是每一个语言都需要支持的,那么我们现在就来看看Dart中是如何处理的。
老实说,Dart和我之前接触过的语言很不同,除了基本类型、基本流程之外其他的都不太一样,包括异步编程。当我知道Dart是单线程的时候,就很疑惑那么在Dart中是怎么实现异步的呢?在这之前,我们还是先来了解一下Dart程序的执行过程是怎样的。
其他程序C/C++也好,Java也好,都是有一个主线程,然后使用特定的方法去创造一个新的线程,来处理IO、网络请求等其他工作。然而,在Dart中不是这种运行方式,在Dart中是以任务来表示运行单元的,在一个任务队里用FIFO的方式一个一个的执行,这就是EventLoop和MicroTask队列:
- 首先初始化连个队列:MicroTask和EventLoop,
- 然后执行main()里面的所有方法函数,
- 最后执行 EventLoo 里面的任务。
MicroTask 队列
MicroTask 队列用于执行很短的异步任务,不过到现在我都不太明白这个是怎么使用的,可能我现在遇到的情况都很简单吧。因为MicroTask都是在EventLoop之前执行,因此它一般用于在EventLoop任务之前需要执行的任务比如资源的释放。一般使用 scheduleMicroTask() 创建一个task。
EventQuene
这个是Dart中最主要的异步实现方式,可以用在如下场景中:
- I/O
- 手势
- 定时器
- Stream 和 Future
- …
毫无疑问,在Dart中 Future 是实现异步的方式,因为 Future 事件讲会自动加入 EventLoop 中,好了那么现在就来看看 Dart 是如何执行任务的:
+--------+
| 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的影响…