以下內(nèi)容從官網(wǎng)得到:
https://webdev.dartlang.org/articles/performance/event-loop
Dart是單線程模型,也就沒有了所謂的主線程/子線程之分盯荤。
Dart也是Event-Looper以及Event-Queue的模型,所有的事件都是通過EventLooper的依次執(zhí)行捶闸。
而Dart的Event Loop就是:
- 從EventQueue中獲取Event
- 處理Event
-
直到EventQueue為空
而這些Event包括了用戶輸入,點擊拖刃,Timer删壮,文件IO等
Dart中只能知道Event處理的先后順序,但是并不知道某個Event執(zhí)行的具體時間點兑牡,因為它的處理模型是一個單線程循環(huán)央碟,而不是基于時鐘調(diào)度(即它的執(zhí)行只是按照Event處理完,就開始循環(huán)下一個Event均函,而與Java中的Thread調(diào)度不一樣亿虽,沒有時間調(diào)度的概念),也就是我們既是指定另一個Delay Time的Task苞也,希望它在預(yù)期的時間后開始執(zhí)行洛勉,它有可能不會在那個時間執(zhí)行,需要看是否前面的Event是否已經(jīng)Dequeue如迟。
異步任務(wù)調(diào)度
當(dāng)有代碼可以在后續(xù)任務(wù)執(zhí)行的時候收毫,有兩種方式攻走,通過dart:async這個Lib中的API即可:
- 使用Future類,可以將任務(wù)加入到Event Queue的隊尾
- 使用scheduleMicrotask函數(shù)此再,將任務(wù)加入到Microtask Queue隊尾
當(dāng)使用EventQueue時昔搂,需要考慮清楚,盡量避免microtask queue過于龐大引润,否則會阻塞其他事件的處理
Isolate并發(fā)
在Dart中實現(xiàn)并發(fā)可以用Isolate巩趁,它是類似于線程(thread)但不共享內(nèi)存的獨立運行的worker痒玩,是一個獨立的Dart程序執(zhí)行環(huán)境淳附。其實默認(rèn)環(huán)境就是一個main isolate。
在Dart語言中蠢古,所有的Dart代碼都運行在某個isolate中奴曙,代碼只能使用所屬isolate的類和值。不同的isolate可以通過port發(fā)送message進(jìn)行交流草讶。(首字母大寫的Isolate代表Isolate對象洽糟,小寫的isolate代表一個獨立的Dart代碼執(zhí)行環(huán)境)
一個Isolate對象就是一個isolate(執(zhí)行環(huán)境)的引用,通常不是當(dāng)前代碼所在的isolate堕战,也就是說坤溃,當(dāng)你使用Isolate對象時,你的目的應(yīng)該是控制其他isolate嘱丢,而不是當(dāng)前的isolate薪介。
當(dāng)你要spawn(產(chǎn)生)一個新isolate時,如果操作成功越驻,當(dāng)前isolate會接收到一個代表新isolate的Isolate對象汁政。
由spawn操作創(chuàng)建的Isolate對象具有控制接口(control port)和控制該對象的能力(capability)。當(dāng)然缀旁, 用Isolate.Isolate構(gòu)造方法創(chuàng)建的Isolate對象可以不必帶有這些能力记劈。
Isolate對象不能用SendPort發(fā)送給另一個Isolate對象,但是控制接口(control port)和能力(capability)是可以發(fā)送的并巍,并且可以在另一個Isolate對象中用發(fā)送來的接口與能力創(chuàng)建一個新的Isolate對象目木。