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文章
10454浏览量
206589 -
多线程
+关注
关注
0文章
271浏览量
19726 -
鸿蒙
+关注
关注
55文章
1645浏览量
42123 -
鸿蒙OS
+关注
关注
0文章
151浏览量
4281
发布评论请先 登录
相关推荐
鸿蒙原生应用开发-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
评论