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隊列處理