<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Dart 是一種支援多工並行的程式語言,它提供了多種機制來實現並行和並行。下面是 Dart 實現多工並行的幾種方式:
Dart 中的 Isolate 是一種輕量級的並行機制,類似於執行緒。每個隔離區域都是獨立的記憶體空間,每個隔離區域都有自己的記憶體空間和執行執行緒,因此不同的隔離區域之間可以獨立地執行程式碼,每個隔離區都在自己的核心上執行,不會阻塞其他 Isolate。從而實現並行。但是有一點需要注意它們之間不能直接共用資料,必須通過訊息傳遞來實現。
下面是一個簡單的範例程式碼,展示瞭如何使用Isolate在Dart中實現並行執行:
import 'dart:isolate'; void main() async { // 建立兩個隔離區域 final isolate1 = await Isolate.spawn(runIsolate, 1); final isolate2 = await Isolate.spawn(runIsolate, 2); // 等待隔離區域執行完畢 await Future.wait([isolate1.exitCode, isolate2.exitCode]); } void runIsolate(int id) { // 隔離區域中執行的程式碼 print('Isolate $id is running'); }
在上面的範例中,我們首先使用Isolate.spawn函數建立兩個隔離區域,每個隔離區域都會執行runIsolate函數,並傳入不同的引數(1和2)。runIsolate函數是隔離區域中實際執行的程式碼,它只是簡單地列印一條資訊。
在建立完隔離區域之後,我們使用Future.wait函數等待隔離區域執行完畢。這裡的exitCode屬性返回隔離區域的退出程式碼,如果程式碼成功執行,它將返回0。
當我們執行上面的程式碼時,我們會看到如下輸出:
Isolate 1 is running
Isolate 2 is running
可以看到,兩個隔離區域幾乎同時啟動並執行,實現了並行執行的效果。這只是Isolate的簡單範例,您可以使用它來執行更復雜的並行任務,例如使用多個Isolate同時下載多個檔案,或在不同的隔離區域中執行計算密集型任務,以提高效能等。
在Dart中,async/await使用的是Future物件來實現非同步操作。當我們在一個函數或方法前面加上async關鍵字時,這個函數就變成了一個非同步函數。在非同步函數中使用await關鍵字可以等待其他非同步操作的結果,而不會阻塞當前函數的執行。
下面是一個使用async/await實現非同步並行的Demo程式碼,它會同時下載兩個URL的內容,並在兩個下載操作都完成後將結果列印出來:
import 'dart:async'; import 'dart:convert'; import 'dart:io'; Future<void> main() async { final url1 = 'https://www.example.com'; final url2 = 'https://www.example.net'; final result1 = downloadUrl(url1); final result2 = downloadUrl(url2); final results = await Future.wait([result1, result2]); for (final result in results) { print(result); } } Future<String> downloadUrl(String url) async { final httpClient = HttpClient(); final request = await httpClient.getUrl(Uri.parse(url)); final response = await request.close(); final contents = await response.transform(utf8.decoder).join(); httpClient.close(); return contents; }
在上面的程式碼中,downloadUrl方法是一個非同步函數,它使用HttpClient類下載給定URL的內容。在main函數中,我們使用Future.wait方法來等待兩個下載操作都完成,然後列印結果。由於result1和result2是同時進行的,因此整個過程是並行的。
Dart 中的 Stream 是一種基於事件的非同步程式設計模型,它可以處理連續的非同步事件流。使用 Stream 可以將一個長時間執行的任務分解成多個小任務,並且可以在每個小任務完成後將結果推播到事件流中,這樣其他任務就可以非同步地獲取結果。
下面是一個使用Stream實現非同步並行的Demo程式碼,它會從兩個URL下載資料並將結果列印出來:
import 'dart:async'; import 'dart:convert'; import 'dart:io'; Future<void> main() async { final url1 = 'https://www.example.com'; final url2 = 'https://www.example.net'; final stream1 = downloadUrl(url1); final stream2 = downloadUrl(url2); await for (final result in StreamGroup.merge([stream1, stream2])) { print(result); } } Stream<String> downloadUrl(String url) async* { final httpClient = HttpClient(); final request = await httpClient.getUrl(Uri.parse(url)); final response = await request.close(); await for (final chunk in response.transform(utf8.decoder)) { yield chunk; } httpClient.close(); }
在上面的程式碼中,downloadUrl方法返回一個Stream物件,用於非同步下載給定URL的內容。在main函數中,我們使用StreamGroup.merge方法將兩個下載流合併為一個,並使用await for迴圈逐個處理下載結果。
需要注意的是,在downloadUrl方法中,我們使用yield關鍵字來逐個將下載的資料塊傳送到Stream中,這樣就可以在下載過程中不斷地將資料傳送出去,而不用等到所有資料都下載完成後再一次性傳送。這也是Stream在處理大量非同步事件時的優勢之一。
Dart 中的 Compute Function 是一種可以在獨立的 Isolate 中執行的函數,它可以接收輸入引數並返回結果。使用 Compute Function 可以將一個計算密集型的任務分解成多個小任務,在每個小任務中使用 Compute Function 來並行地計算結果,最終將結果合併起來。
下面是一個使用Compute Function實現非同步並行的Demo程式碼,它會計算兩個斐波那契數列,並將結果列印出來:
import 'dart:async'; import 'package:flutter/foundation.dart'; Future<void> main() async { final result1 = compute(fibonacci, 40); final result2 = compute(fibonacci, 41); final results = await Future.wait([result1, result2]); for (final result in results) { print(result); } } int fibonacci(int n) { if (n == 0) return 0; if (n == 1) return 1; return fibonacci(n - 1) + fibonacci(n - 2); }
在上面的程式碼中,我們使用compute函數將斐波那契數列的計算任務交給後臺隔離執行緒執行,然後使用Future.wait方法等待兩個任務都完成後列印結果。
需要注意的是,在使用compute函數時,傳遞給它的函數必須是頂層函數或靜態函數,因為後臺隔離執行緒無法存取非靜態變數或範例變數。
總的來說,Dart 提供了多種機制來實現多工並行,包括 Isolate、async/await、Stream 和 Compute Function。這些機制可以根據具體的任務需求選擇使用,從而實現高效的並行和並行。
以上就是一文詳解Dart如何實現多工並行的詳細內容,更多關於Dart 多工並行的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45