【Flutter 專題】92 圖解 Dart 單線程實(shí)現(xiàn)異步處理之 Isolate (一)

      網(wǎng)友投稿 973 2025-04-02

      小菜剛嘗試了 Future 和 async-await 實(shí)現(xiàn)的簡(jiǎn)單異步操作,但對(duì)于耗時(shí)較長(zhǎng)的異步該如何處理呢?對(duì)于 Android 來(lái)說(shuō)可以新開一個(gè)線程單獨(dú)處理,而對(duì)應(yīng)的 Dart 可以用 Isolate 來(lái)處理;

      Isolate

      Isolate 是對(duì) Dart 并發(fā)模式的實(shí)現(xiàn),類似于 Android 中的 Thread 線程,但與 Thread 有本質(zhì)的區(qū)別,Thread 可以實(shí)現(xiàn)內(nèi)存共享,而 Isolate 不能;

      所有的 Dart Code 都是在 Isolate 中執(zhí)行的,代碼只能使用同一個(gè) Isolate 中的內(nèi)容,Isolate 有自己的內(nèi)存和事件循環(huán)機(jī)制;不同的 Isolate 是內(nèi)存隔離的,因此只能通過 Port 機(jī)制發(fā)送消息通信,其原理是向不同的 Isolate 隊(duì)列中執(zhí)行寫任務(wù);

      Isolate 一般通過 spawn / spawnUri 來(lái)創(chuàng)建對(duì)象;

      external static Future spawn( void entryPoint(T message), T message, {bool paused: false, bool errorsAreFatal, SendPort onExit, SendPort onError, @Since("2.3") String debugName});

      簡(jiǎn)單了解源碼,spawn 必須的參數(shù)包括需要耗時(shí)操作的 entryPoint 和 T 任意類型的 message 數(shù)據(jù),即 Isolate 中可以傳遞任意類型的數(shù)據(jù);

      【Flutter 專題】92 圖解 Dart 單線程實(shí)現(xiàn)異步處理之 Isolate (一)

      _loadIsolateDate() async { await Isolate.spawn(_backgroundWork, ReceivePort().sendPort); } static _backgroundWork(SendPort sendPort) { sendPort.send('BackgroundWork -> currentTime -> ${DateTime.now().millisecondsSinceEpoch}'); }

      external static Future spawnUri( Uri uri, List args, var message, {bool paused: false, SendPort onExit, SendPort onError, bool errorsAreFatal, bool checked, Map environment, @Deprecated('The packages/ dir is not supported in Dart 2') Uri packageRoot, Uri packageConfig, bool automaticPackageResolution: false, @Since("2.3") String debugName});

      簡(jiǎn)單了解源碼,spawnUri 需要三個(gè)必要參數(shù),uri 為其他 Isolate 代碼文件的路徑;列表 args 為傳遞的參數(shù)列表,message 動(dòng)態(tài)消息,一般是 SendPort;

      _loadIsolateDate03() async { ReceivePort receivePort = ReceivePort(); await Isolate.spawnUri(new Uri(path: "./utils/second_isolate.dart"), ['params01, params02, params03'], receivePort.sendPort); receivePort.listen((val) => print('listen -> 【$val】')); }

      Isolate 可以方便的利用多核 CPU 來(lái)處理耗時(shí)操作,因內(nèi)存不共享,需要通過 Port 進(jìn)行消息通訊;其中 Port 消息傳遞也是異步的;

      Port 一般是成對(duì)出現(xiàn),分別是 ReceivePort 接收端口和 SendPort 發(fā)送端口;而 ReceivePort 也可以生成自己的 SendPort;只需要把 SendPort 傳遞給其他 Isolate 即可;

      _loadIsolateDate01() async { ReceivePort receivePort = ReceivePort(); await Isolate.spawn(_backgroundWork, receivePort.sendPort); receivePort.listen((val) => print('listen -> 【$val】')); } static _backgroundWork(SendPort sendPort) async { sendPort.send( 'BackgroundWork -> currentTime -> ${DateTime.now().millisecondsSinceEpoch}'); Future.delayed(Duration(seconds: 3), () { return sendPort.send( 'BackgroundWork delayed 3s -> currentTime -> ${DateTime.now().millisecondsSinceEpoch}'); }); }

      雙向通訊與單向通訊一樣,把雙方的 SendPort 相互傳遞即可;

      _loadIsolateDate02() async { ReceivePort receivePort = ReceivePort(); var sendPort; await Isolate.spawn(_backgroundWork2, receivePort.sendPort); receivePort.listen((val) { if (val is SendPort) { sendPort = val as SendPort; print("雙向通訊建立成功"); } print("Isolate Recevie Data -> 【$val】"); if (sendPort != null) { sendPort.send('_loadIsolateDate02 -> currentTime -> ${DateTime.now().millisecondsSinceEpoch}'); } }); } static _backgroundWork2(SendPort sendPort) async { ReceivePort receivePort = new ReceivePort(); receivePort.listen((val) { print("Background Isolate Receive Data -> 【$val]"); }); sendPort.send('BackgroundWork -> currentTime -> ${DateTime.now().millisecondsSinceEpoch}'); sendPort.send(receivePort.sendPort); Future.delayed(Duration(seconds: 2), () { return sendPort.send('BackgroundWork delayed 2s -> currentTime -> ${DateTime.now().millisecondsSinceEpoch}'); }); Future.delayed(Duration(seconds: 5), () { return sendPort.send(receivePort.sendPort); }); }

      Isolate 就像機(jī)器中的一個(gè)小空間,有自己的內(nèi)存塊,因此在使用 Isolate 結(jié)束后應(yīng)及時(shí)關(guān)閉并銷毀當(dāng)前 Isolate;

      isolate.kill(priority: Isolate.immediate);

      Tips

      小菜剛開始創(chuàng)建 Isolate 時(shí),遇到如下錯(cuò)誤;

      需要將 Isolate.spawn 中的 message 參數(shù)方法設(shè)置成 static 方法或放置在 main() 入口;

      由于篇幅和測(cè)試案例不足,小菜分為兩篇小博客對(duì) Isolate 進(jìn)行學(xué)習(xí),對(duì)異步的認(rèn)知還不夠深入;如有錯(cuò)誤請(qǐng)多多指導(dǎo)!

      來(lái)源: 阿策小和尚

      flutter 任務(wù)調(diào)度

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Excel在線表格(4分鐘之前已更新)
      下一篇:信息架構(gòu)和零代碼,創(chuàng)新技術(shù)的未來(lái)
      相關(guān)文章
      国产亚洲日韩在线三区| 亚洲乱码无人区卡1卡2卡3| 亚洲?V无码乱码国产精品| 亚洲国产日韩在线| 亚洲综合网美国十次| 久久水蜜桃亚洲av无码精品麻豆 | 亚洲AV无码久久| 亚洲精品无码Av人在线观看国产 | 亚洲女同成人AⅤ人片在线观看| 无码天堂亚洲国产AV| 国产精品自拍亚洲| 亚洲Aⅴ无码一区二区二三区软件| 午夜亚洲国产精品福利| 久久精品国产亚洲av瑜伽| 国产成人精品日本亚洲语音 | 无码亚洲成a人在线观看| 亚洲av永久无码一区二区三区| 亚洲精品无码久久久久APP | 久久亚洲精品国产精品| 亚洲资源在线视频| 亚洲喷奶水中文字幕电影| 亚洲综合丁香婷婷六月香| 亚洲欧美日韩自偷自拍| 亚洲av无码日韩av无码网站冲| 亚洲精品无码成人| 国产精品亚洲五月天高清| 亚洲一区无码精品色| 亚洲女同成av人片在线观看 | 亚洲国产欧美国产综合一区 | 一本色道久久综合亚洲精品蜜桃冫 | 亚洲国产成人手机在线电影bd| 亚洲天堂2016| 亚洲中文字幕无码久久| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 亚洲国产精品网站在线播放| 无码国产亚洲日韩国精品视频一区二区三区 | 国产成人精品久久亚洲| 久久精品九九亚洲精品天堂| 亚洲精品综合一二三区在线| 亚洲人成高清在线播放| 亚洲成a人无码亚洲成www牛牛|