欢迎访问艾立兹站 Aliz- 专注建站教程与技术分享
您当前的位置:首页 > 鸿蒙开发

鸿蒙原生应用开发-ArkTS语言基础类库多线程CPU密

时间:2024-03-20 09:11:26  来源:网络  作者:秩名  阅读:

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%')

  }

}

本文参考引用HarmonyOS官方开发文档,基于API9。

本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载

发表评论 共有0条评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
公众号二维码

扫码关注公众号
获取全套技术教程