CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主線程進行。例如圖像處理、視頻編碼、數據分析等。
基于多線程并發機制處理CPU密集型任務可以提高CPU利用率,提升應用程序響應速度。
當進行一系列同步任務時,推薦使用Worker;而進行大量或調度點較為分散的獨立任務時,不方便使用8個Worker去做負載管理,推薦采用TaskPool。接下來將以圖像直方圖處理以及后臺長時間的模型預測任務分別進行舉例。
使用TaskPool進行圖像直方圖處理
1.實現圖像處理的業務邏輯。
2.數據分段,將各段數據通過不同任務的執行完成圖像處理。
3.創建Task,通過execute()執行任務,在當前任務結束后,會將直方圖處理結果同時返回。
結果數組匯總處理。
import taskpool from '@ohos.taskpool';
@Concurrent
function imageProcessing(dataSlice: ArrayBuffer) {
// 步驟1: 具體的圖像處理操作及其他耗時操作
return dataSlice;
}
function histogramStatistic(pixelBuffer: ArrayBuffer) {
// 步驟2: 分成三段并發調度
let number = pixelBuffer.byteLength / 3;
let buffer1 = pixelBuffer.slice(0, number);
let buffer2 = pixelBuffer.slice(number, number * 2);
let buffer3 = pixelBuffer.slice(number * 2);
let task1 = new taskpool.Task(imageProcessing, buffer1);
let task2 = new taskpool.Task(imageProcessing, buffer2);
let task3 = new taskpool.Task(imageProcessing, buffer3);
taskpool.execute(task1).then((ret: ArrayBuffer[]) = > {
// 步驟3: 結果處理
});
taskpool.execute(task2).then((ret: ArrayBuffer[]) = > {
// 步驟3: 結果處理
});
taskpool.execute(task3).then((ret: ArrayBuffer[]) = > {
// 步驟3: 結果處理
});
}
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() = > {
let data: ArrayBuffer;
histogramStatistic(data);
})
}
.width('100%')
}
.height('100%')
}
}
審核編輯 黃宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
cpu
+關注
關注
68文章
10512瀏覽量
207271 -
多線程
+關注
關注
0文章
271瀏覽量
19760 -
鴻蒙
+關注
關注
55文章
1919瀏覽量
42197 -
鴻蒙OS
+關注
關注
0文章
189瀏覽量
4304
發布評論請先 登錄
相關推薦
鴻蒙原生應用開發-ArkTS語言基礎類庫概述
ArkTS語言基礎類庫是HarmonyOS系統上為應用開發者提供的常用基礎能力,主要包含能力如下圖所示。
1.提供異步并發和多線程并發的能
發表于 03-05 15:42
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程CPU密集型任務TaskPool
CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主
發表于 03-19 14:14
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程I/O密集型任務開發
使用異步并發可以解決單次I/O任務阻塞的問題,但是如果遇到I/O密集型任務,同樣會阻塞線程中其它任務的執行,這時需要使用
發表于 03-21 14:57
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(一)
TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型
發表于 03-25 14:11
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(二)
TaskPool運作機制
圖1 TaskPool運作機制示意圖
TaskPool支持開發者在主線程封裝任
發表于 03-26 15:25
鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(三)
一、TaskPool注意事項
實現任務的函數需要使用裝飾器@Concurrent標注,且僅支持在.ets文件中使用。
實現任務的函數入參需滿足序列化支持的類型。
由于不同線程中上下文對
發表于 03-27 16:26
什么時候要使用多線程
什么時候要使用多線程:cpu密集型:(比如一個while( true ){ i++;})IO密集型:(比如一個從磁盤拷貝數據到另一個磁盤的拷貝進程)1)計算
發表于 09-06 07:25
計算密集型的程序簡析
人工智能學習1. 人工智能應用場景網絡安全、電子商務、計算模擬、社交網絡 … …2. 人工智能必備三要素數據,算法,計算力計算力之CPU、GPU對比:CPU主要適合I\O密集型的任務G
發表于 09-07 06:14
python多線程和多進程對比
電視邊吃飯邊聊天。這就是我們的 多進程 才能做的事了。2. 單線程VS多線程VS多進程文字總是蒼白無力的,不如用代碼直接來測試一下。開始對比之前,首先定義四種類型的場景 - CPU計算密集型
發表于 03-15 16:42
評論