Dart 是一种单线程语言
首先我们需要记住
Dart 是单线程的并且Flutter依赖于Dart
- 重点
- Dart 同一时刻只执行一个操作,其他操作在该操作之后执行,这表示只要一个操作正在执行它就不会被其他代码中断
- 同样的如果该操作需要消耗一段时间,那么在操作执行期间应用将被阻塞
Dart 执行模型
那么,Dart 是如何管理事件执行呢
看下dart的 事件循环机制
当启动一个Flutter/Dart 程序时 将创建启动一个新的线程或者进程Dart中叫
Isolate
这个Iolate 将作为你程序中代码运行的地方,
该Isolate 创建后
- dart 会初始化两个先进先出的队列
microTaskQueue
,eventQueue
- 初始化完成厚执行mian() 方法
- 启动事件循环
在该isolate的整个生命周期中,一个被称为事件循环的东西来决定你的代码执行方式以及顺序(取决与Microtask和Event 队列)
- 所以一个isolate 包含
- 一个完整的事件循环机制
- 两个队列
Microtask
,event
事件循环是一种无限循环机制,在程序执行期间如果没有其他代码执行那 事件循环将执行如下操作
void eventLoop(){ while (microTaskQueue.isNotEmpty){ fetchFirstMicroTaskFromQueue(); executeThisMicroTask(); return; } if (eventQueue.isNotEmpty){ fetchFirstEventFromQueue(); executeThisEventRelatedCode(); } }
运行时,
event loop
优先处理microtask queue
,直到**microtask queue
为空的时候,再开始处理event queue
**。
event queue
不为空的话,一次取一个event
执行,执行完后会重新判断microtask
是否为空。若不为空则处理microtask
任务示例代码
void mian(){ new Future(() { print("1"); }); Future.microtask(() { print('microtask1 可以看出 先运行microtask 对列中的消息'); }); new Future(() { print("3"); }); Future.microtask(() { print('microtask2 可以看出 先运行microtask 对列中的消息'); }); } //microtask1 可以看出 先运行microtask 对列中的消息 //microtask2 可以看出 先运行microtask 对列中的消息 //1 //3
那这两个事件队列都是用来干什么的呢
- ***
MicroTask
队列 用于非常简短且需要异步执行的内部动作,这些动作需要在其他事情完成之后,在处理Event
***队列之前完成.
- 所以
Microtask
不能执行太耗时的操作否则会阻塞队列,所以我们应该有线考虑***Event***队列- Event队列 适用与以下参考模型
- 外部事件比如
- IO
- 绘制
- 交互
- 流处理
- …等
- futures
- 事实上每次外部事件被触发时,要执行的代码都会被Event队列引用
- 一旦没有任何MicroTask运行,EventLoop会取出Event队列中的第一项并执行它。
- 注意Future 也通过Event队列处理