在Dart中實現(xiàn)并發(fā)可以使用Isolate。
Isolate翻譯過來是孤立、隔離的意思。它是類似于線程但不共享內(nèi)存的獨立運行的worker,是一個獨立的Dart程序執(zhí)行環(huán)境,默認的執(zhí)行環(huán)境就是一個main isolate。所有的Dart代碼都運行在某個isolate中,代碼只能使用所屬isolate的類和值。不同的isolate可以通過port發(fā)送message進行交流。(首字母大寫的Isolate代表Isolate對象,小寫的isolate代表一個獨立的Dart代碼執(zhí)行環(huán)境)

一個Isolate對象就是一個isolate的引用,通常不是當前代碼所在的isolate,也就是說,當你使用Isolate對象時,你的目的應該是控制其他isolate。當你要spawn(產(chǎn)生)一個新的isolate時,如果操作成功,當前isolate會接收到一個代表新isolate的Isolate對象。
isolate在它自己的事件循環(huán)(event loop)中執(zhí)行代碼,每個事件都可以在該isolate的微任務隊列(microtask queue)中執(zhí)行更小的任務。
Isolate對象允許其他isolate控制、監(jiān)聽它所代表的isolate的事件循環(huán),例如當這個isolate發(fā)生未捕獲錯誤時,可以暫停(pause)此isolate或獲取(addErrorListener)錯誤信息。
controlPort識別并授予對isolate控制的權(quán)限,pauseCapability和terminateCapability會對某些控制操作進行權(quán)限保護。例如,暫停(pause)一個無pauseCapability的Isolate對象是不生效的。
由spawn操作創(chuàng)建的Isolate對象具有控制接口(control port)和控制該對象的能力(capability)。當然,用Isolate.Isolate構(gòu)造方法創(chuàng)建的Isolate對象可以不必帶由這些能力。
Isolate對象不能用SendPort發(fā)送給另一個Isolate對象,但是控制接口(control port)和能力(capability)是可以發(fā)送的,并且可以在另一個Isolate對象中用發(fā)送來的接口與能力創(chuàng)建一個新的Isolate對象。
external static Future<Isolate> spawn<T>(
void entryPoint(T message), T message,
{bool paused: false,
bool errorsAreFatal,
SendPort onExit,
SendPort onError,
@Since("2.3") String debugName});
創(chuàng)建一個與當前isolate共享代碼的isolate,entryPoint參數(shù)指定了調(diào)用產(chǎn)生的isolate的初始函數(shù),入口函數(shù)(entry-point function)在新isolate中以message作為唯一參數(shù)被調(diào)用。(可以想到,默認的isolate以main()函數(shù)作為入口)
這個函數(shù)必須是可以以單一參數(shù)調(diào)用的全局函數(shù)或靜態(tài)方法,也就是說,它應該是接收至少一個位置參數(shù)并且最多一個必要位置參數(shù)的編譯時函數(shù)常量值。只要它能用一個參數(shù)來調(diào)用,它可以接收任意數(shù)量的可選參數(shù)。它不能是函數(shù)表達式或?qū)嵗椒ā?br>
初始化消息(message)通常包含了一個SendPort,以便生產(chǎn)者和被產(chǎn)這互相交流。
如果paused參數(shù)賦值為true,那么這個isolate啟動時就是entryPoint方法調(diào)用前的暫停狀態(tài),就想初始化時就調(diào)用了isolate.pause(isolate.pauseCapability)一樣。要回復運行,可以調(diào)用isolate.resume(isolate.pauseCapability)。
如果errorsAreFatal、onExit、onError參數(shù)被賦值,就相當于在isolate啟動前,setErrorsFatal,addOnExitListener和addErrorListener分別以相應參數(shù)調(diào)用。
如果忽略errorsAreFatal參數(shù),平臺會以默認行為或者繼承自當前isolate的行為來處理錯誤。
你也可以對返回的isolate調(diào)用setErrorsFatal、addOnExitListener和addErrorListener等方法,但是除非isolate以pause狀態(tài)啟動,它這些方法調(diào)用前可能已經(jīng)執(zhí)行完畢了。
import 'dart:isolate';
void main(List<String> arguments) {
// 創(chuàng)建一個消息接收器
var receivePort = ReceivePort();
// 創(chuàng)建一個具有發(fā)送器的isolate,第一個參數(shù)為新的isolate的entryPoint,第二個是傳的是當前
Isolate.spawn(isolateOther, receivePort.sendPort);
// 主isolate接收持有主進程發(fā)送器的isolate發(fā)過來的消息
receivePort.listen((message) {
if(message is SendPort) {
message.send('已收到子isolate的發(fā)送器');
}else {
print('接到子isolate消息:'+message);
}
});
}
// 內(nèi)存隔離的新的isolate的具體業(yè)務邏輯函數(shù)
void isolateOther(SendPort sendPort) {
// 創(chuàng)建一個消息接收器
var receivePort = ReceivePort();
// 通過傳過來的mainisolate的sendport(發(fā)送器) 將當前isolate的發(fā)送器發(fā)到mainisolate
sendPort.send(receivePort.sendPort);
sendPort.send('你收到我的消息了嗎');
receivePort.listen((message) {
print('接到主isolate消息:'+message);
});
}