使用異步并發可以解決單次I/O任務阻塞的問題,但是如果遇到I/O密集型任務,同樣會阻塞線程中其它任務的執行,這時需要使用多線程并發能力來進行解決。
I/O密集型任務的性能重點通常不在于CPU的處理能力,而在于I/O操作的速度和效率。這種任務通常需要頻繁地進行磁盤讀寫、網絡通信等操作。此處以頻繁讀寫系統文件來模擬I/O密集型并發任務的處理。
定義并發函數,內部密集調用I/O能力。
import fs from '@ohos.file.fs';
// 定義并發函數,內部密集調用I/O能力
@Concurrent
async function concurrentTest(fileList: string[]) {
// 寫入文件的實現
async function write(data, filePath) {
let file = await fs.open(filePath, fs.OpenMode.READ_WRITE);
await fs.write(file.fd, data);
fs.close(file);
}
// 循環寫文件操作
for (let i = 0; i < fileList.length; i++) {
write('Hello World!', fileList[i]).then(() = > {
console.info(`Succeeded in writing the file. FileList: ${fileList[i]}`);
}).catch((err) = > {
console.error(`Failed to write the file. Code is ${err.code}, message is ${err.message}`)
return false;
})
}
return true;
}
開始前熟悉鴻蒙文檔
鴻蒙OS開發 | 更多內容↓點擊 | HarmonyOS與OpenHarmony技術 |
---|---|---|
鴻蒙技術文檔 | 《鴻蒙NEXT星河版開發學習文檔》 |
使用TaskPool執行包含密集I/O的并發函數:通過調用execute()方法執行任務,并在回調中進行調度結果處理。示例中的filePath1和filePath2的獲取方式請參見獲取應用文件路徑。
import taskpool from '@ohos.taskpool';
let filePath1 = ...; // 應用文件路徑
let filePath2 = ...;
// 使用TaskPool執行包含密集I/O的并發函數
// 數組較大時,I/O密集型任務任務分發也會搶占主線程,需要使用多線程能力
taskpool.execute(concurrentTest, [filePath1, filePath2]).then((ret) = > {
// 調度結果處理
console.info(`The result: ${ret}`);
})
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
多線程
+關注
關注
0文章
278瀏覽量
20016 -
鴻蒙
+關注
關注
57文章
2368瀏覽量
42899 -
鴻蒙OS
+關注
關注
0文章
189瀏覽量
4456
發布評論請先 登錄
相關推薦
鴻蒙OS開發實例:【ArkTS類庫多線程@Concurrent裝飾器校驗并發函數】
在使用TaskPool時,執行的并發函數需要使用該裝飾器修飾,否則無法通過相關校驗。從API version 9開始,該裝飾器支持在ArkTS卡片中使用。
鴻蒙OS開發實例:【ArkTS類庫多線程CPU密集型任務TaskPool】
CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主線程進行。例如圖像
鴻蒙OS開發案例:【ArkTS類庫多線程CPU密集型任務Worker】
通過某地區提供的房價數據訓練一個簡易的房價預測模型,該模型支持通過輸入房屋面積和房間數量去預測該區域的房價,模型需要長時間運行,房價預測需要使用前面的模型運行結果,因此需要使用Worker。
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述
并發模型是用來實現不同應用場景中并發任務的編程模型,常見的并發模型分為基于內存共享的并發模型和基于消息通信的并發模型。
Actor并發模型作為基于消息通信并發模型的典型代表,不需要開發者去面對鎖帶來
發表于 03-28 14:35
鴻蒙APP開發:【ArkTS類庫多線程】TaskPool和Worker的對比
TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型任務。可以有效地避免這
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(二)
TaskPool運作機制
圖1 TaskPool運作機制示意圖
TaskPool支持開發者在主線程封裝任務拋給任務隊列,系統選擇合適的工作線程
發表于 03-26 15:25
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(一)
TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型任務。可以有效地避免這
發表于 03-25 14:11
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程CPU密集型任務TaskPool
CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主線程進行。例如圖像
發表于 03-19 14:14
鴻蒙原生應用開發-ArkTS語言基礎類庫概述
ArkTS語言基礎類庫是HarmonyOS系統上為應用開發者提供的常用基礎能力,主要包含能力如下圖所示。
1.提供異步并發和多線程并發的能
發表于 03-05 15:42
鴻蒙原生應用開發-ArkTS語言基礎類庫單次I/O任務開發
Promise和async/await提供異步并發能力,適用于單次I/O任務的場景開發,本文以使用異步進行單次文件寫入為例來提供指導。
實現單次I
發表于 03-04 14:07
評論