dart 07 3 併發多執行緒

2021-10-07 08:29:26 字數 2888 閱讀 4848

dart 雖然是乙個單執行緒語言 但是不代表他不支援多執行緒併發

mainisolate中建立newisolate有兩種方法spawn,spawnuri

建立步驟

建立newisolate並與當前呼叫mainisolate並通過sendport建立連線

建立newisolate獲得mainisolatemainreciveportmainsendport

傳送資料

接收資料通過

在合適的機會銷毀isolate

下面看具體的步驟

message只有[message]作為entrypoint的引數。

entrypoint函式就是要在**newisolate**中執行的函式

因為isolate相互通訊需要持有對方的sendport

這樣**newisolate持有了mainsendport**

所以是通過入口函式將**主isolate的sendport傳送到newisolate**

需要注意isolate 的「入口函式(entrypoint)」必須是頂級函式或靜態方法。

示例**

import 'dart:io';

import 'dart:isolate';

main() async

isolate newisolate;

void createisolate() async else

});}// 入口函式將在newisolate中執行

void excuter(sendport mainsendport) );

// 獲取newisolate的 sendport

sendport new_send = new_rp.sendport;

//將其傳送到 mainisolate

// 讓 mainisolate 持有 newsendport,用於通訊

// 使 mainisolate 可以通過 newsendport 將 mainisolate 的傳送訊息回 newisolate

mainsendport.send([0, new_send]);

// 模擬耗時5秒

sleep(duration(seconds: 5));

mainsendport.send([1, "excuter 任務完成"]);

print("newisolat 執行結束");

}//銷毀newisolate

destroynewisolate()

/* 輸出

newisolat通過main_send傳送來一條訊息 [0, sendport] ,到mainisolate

newisolat通過main_send傳送來一條訊息 [1, excuter 任務完成] ,到mainisolate

newisolat 執行結束

mianisolate 通過new_send傳送了一條訊息到newisolate

銷毀newisolate

*/

注意這種方式

示例**

newisolate檔案newtaskuri.dart

輸出結果

無論是上面的**spawn還是spawnuri**,執行後都會建立兩個isolate

想要相互通訊就必須持有對方的sendport

釋放newisolate

platform-channel 通訊僅僅主 isolate 支援。該主 isolate對應於應用啟動時建立的isolate

區別

可以看到 無論是實現上述哪一種isolate **數量都是比較繁瑣的

對此flutter提供了乙個函式**compute** 該函式封裝了通過spawn實現isolate的**

避免我們去寫通過spawn建立isolate的一系列**,

直接通過compute函式,這樣讓我們的**看起來更簡潔了

如果任務只是進行一次計算返回結果,不需要雙端多次溝通的話 使用compute 函式將非常簡單

compute(computecallbackcallback, q message)

message為訊息 可以是callback執行函式的引數 示例

怎麼樣 是不是很簡單

直觀的說可以根據任務執行時間長短來區分

掘金文章 [譯] flutter 非同步程式設計:future、isolate 和事件迴圈

多執行緒併發

多執行緒併發主要有3個方面 1 同步器 主要有synchronized,reentrantlock 訊號量,門栓 countdownlatch 障柵 cyclicbarrier 交換器。2 同步容器 主要包括 對映 集 佇列 對映 concurrenthashmap,concurrentskipli...

多執行緒併發

更簡單的執行緒池 多執行緒和多程序都可以很容易的實現併發,協程通過切換上下文來充分利用cpu實現併發效果 threading模組 thread類的基本狀態和行為 屬性名和值 name none,group none,target none,args kwargs daemon none 方法 sta...

(多執行緒)多執行緒的併發安全

多執行緒併發操作同乙個資源 同步鎖 多執行緒操作的鎖必須唯一 必須搞清楚 哪些 需要同步?那些在操作共享資源的 只要包含非讀的操作,或者根據共享資源進行條件判斷的,就需要同步!同步 塊解決 package com.gc.thread 多執行緒操作共享資源 併發 執行緒安全問題 同步 鎖 相對而言效能...