Flutter 93: 圖解 Dart 單執行緒實現非同步處理之 Isol
小菜剛學習了 Isolate 的部分基本用法,今天繼續嘗試 compute 及其使用方式;
Isolate
小菜之前瞭解到 ReceivePort 和 SendPort 是成對出現的,是 Isolate 之間唯一的訊息通訊的方式;
ReceivePort
abstract class ReceivePort implements Stream {
external factory ReceivePort();
external factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort);
StreamSubscription listen(void onData(var message),
{Function onError, void onDone(), bool cancelOnError});
void close();
SendPort get sendPort;
}
簡單分析原始碼可得,ReceivePort 中透過 get 獲取一個 SendPort 物件,透過 SendPort 傳送訊息到 ReceivePort 中,之後再透過 listen 進行監聽;
SendPort
abstract class SendPort implements Capability {
void send(var message);
bool operator ==(var other);
int get hashCode;
}
SendPort 內容很簡單,主要是透過 send 方法向 ReceivePort 傳遞訊息;
Compute
小菜嘗試了 Isolate 的基本用法,需要使用 ReceivePort 和 SendPort 來進行訊息通訊;而 Flutter 提供了更簡單的 Compute Function;
原始碼分析
Future<R> compute<Q, R>(isolates.ComputeCallback<Q, R> callback, Q message, { String debugLabel }) async {
...
final Isolate isolate = await Isolate.spawn<_IsolateConfiguration<Q, FutureOr<R>>>(_spawn,
_IsolateConfiguration<Q, FutureOr<R>>(
callback, message,
resultPort.sendPort,
debugLabel, flow.id,
),
errorsAreFatal: true,
onExit: resultPort.sendPort,
onError: errorPort.sendPort,
);
final Completer<R> result = Completer<R>();
errorPort.listen((dynamic errorData) {
...
});
resultPort.listen((dynamic resultData) {
...
});
await result.future;
Timeline.startSync('$debugLabel: end', flow: Flow.end(flow.id));
resultPort.close();
errorPort.close();
isolate.kill();
Timeline.finishSync();
return result.future;
}
簡單瞭解原始碼,Compute 實際是對 Isolate 的封裝,Compute 是透過 Isolate.spawn() 方式來處理 Isolate 其中 compute() 方法中在通訊結束後自動進行 Isolate.kill() 銷燬;且 compute() 直接返回內容,無需考慮 listen 監聽等;
案例嘗試
compute() 包含兩個必填引數,第一個是定義新的 Isolate 的核心執行方法,第二個是函式對應的引數,可以是多個任意型別;因為 compute 實際是透過 Isolate.spawn() 來處理的,則對應的耗時方法也需要是在頂級 main 函式中或 static 方法;
_loadIsolateDate04() async {
print('main Isolate, current Isolate = ${Isolate.current.hashCode}');
print(await compute(getName, ''));
}
static String getName(String name) {
print('new Isolate, current Isolate = ${Isolate.current.hashCode}');
sleep(Duration(seconds: 2));
return '阿策小和尚';
}
對於 compute() 的異常處理,可以透過 try-catch 進行捕獲;
_loadIsolateDate05(bool isError) async {
print('main Isolate, current Isolate = ${Isolate.current.hashCode}');
try {
print(await compute(_backgroundWork3, isError));
} catch (e) {
print(e);
}
}
static _backgroundWork3(bool isError) async {
print('new Isolate, current Isolate = ${Isolate.current.hashCode}');
if (!isError) {
return await Future.delayed(Duration(seconds: 2), () {
return 'BackgroundWork delayed 2s -> currentTime -> ${DateTime.now().millisecondsSinceEpoch}';
});
} else {
return await Future.error(ArgumentError.notNull('Input'));
}
}
小菜對 Isolate 的原始碼還未深入研究,僅停留在應用層;如有錯誤請多多指導!
來源: 阿策小和尚
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2730/viewspace-2825765/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Flutter 專題】93 圖解 Dart 單執行緒實現非同步處理之 Isolate (二)Flutter圖解Dart執行緒非同步
- 【Flutter 專題】92 圖解 Dart 單執行緒實現非同步處理之 Isolate (一)Flutter圖解Dart執行緒非同步
- 【Flutter 專題】91 圖解 Dart 單執行緒實現非同步處理之 Future (二)Flutter圖解Dart執行緒非同步
- 【Flutter 專題】95 圖解 Dart 單執行緒實現非同步處理之 Task QueueFlutter圖解Dart執行緒非同步
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- QT執行緒同步與非同步處理QT執行緒非同步
- Dart 非同步與多執行緒Dart非同步執行緒
- Flutter非同步與執行緒詳解Flutter非同步執行緒
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- 執行緒安全處理之Threadlocal執行緒thread
- Java同步之執行緒池詳解Java執行緒
- Java多執行緒並行處理任務的實現Java執行緒並行
- JavaScript 單執行緒之非同步程式設計JavaScript執行緒非同步程式設計
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- 9.2 運用API實現執行緒同步API執行緒
- 3種方式實現python多執行緒併發處理Python執行緒
- 高併發IPC通訊實現:HarmonyOS中的非同步呼叫與多執行緒處理非同步執行緒
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- Java執行緒池和Spring非同步處理高階篇Java執行緒Spring非同步
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- JS單執行緒和非同步JS執行緒非同步
- 單執行緒-非阻塞-長連結執行緒
- 併發-0-同步/非同步/阻塞/非阻塞/程式/執行緒非同步執行緒
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- (六)Flutter學習之Dart非同步操作詳解FlutterDart非同步
- 企圖使用c++執行緒解決nodejs單執行緒問題C++執行緒NodeJS
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- JAVA不使用執行緒池來處理的非同步的方法Java執行緒非同步
- mysql 5.7 執行緒阻塞處理MySql執行緒
- 如何處理執行緒死鎖執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- 對執行緒、協程和同步非同步、阻塞非阻塞的理解執行緒非同步
- flutter入門:執行緒,非同步,宣告式UIFlutter執行緒非同步UI
- Flutter(五)之徹底搞懂Dart非同步FlutterDart非同步
- 透過簡單示例瞭解執行緒池實現原理執行緒
- Python簡單實現多執行緒例子Python執行緒
- Swift多執行緒之Operation:非同步載入CollectionView圖片Swift執行緒非同步View
- 多執行緒和多執行緒同步執行緒