0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙OS开发实例:【ArkTS类库多线程CPU密集型任务TaskPool】

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-04-01 22:25 次阅读

CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。

基于多线程并发机制处理CPU密集型任务可以提高CPU利用率,提升应用程序响应速度。

当进行一系列同步任务时,推荐使用Worker;而进行大量或调度点较为分散的独立任务时,不方便使用8个Worker去做负载管理,推荐采用TaskPool。接下来将以图像直方图处理以及后台长时间的模型预测任务分别进行举例。

使用TaskPool进行图像直方图处理

1.实现图像处理的业务逻辑。

2.数据分段,将各段数据通过不同任务的执行完成图像处理。

3.创建Task,通过execute()执行任务,在当前任务结束后,会将直方图处理结果同时返回。

结果数组汇总处理。

搜狗高速浏览器截图20240326151344.png

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
    cpu
    +关注

    关注

    68

    文章

    10832

    浏览量

    211301
  • 多线程
    +关注

    关注

    0

    文章

    277

    浏览量

    19924
  • 鸿蒙
    +关注

    关注

    57

    文章

    2325

    浏览量

    42764
  • 鸿蒙OS
    +关注

    关注

    0

    文章

    188

    浏览量

    4373
收藏 人收藏

    评论

    相关推荐

    HarmonyOS CPU与I/O密集型任务开发指导

    。 基于多线程并发机制处理CPU密集型任务可以提高CPU利用率,提升应用程序响应速度。 当进行一系列同步
    的头像 发表于 02-18 10:17 959次阅读
    HarmonyOS <b class='flag-5'>CPU</b>与I/O<b class='flag-5'>密集型</b><b class='flag-5'>任务</b><b class='flag-5'>开发</b>指导

    鸿蒙OS开发案例:【ArkTS多线程CPU密集型任务Worker】

    通过某地区提供的房价数据训练一个简易的房价预测模型,该模型支持通过输入房屋面积和房间数量去预测该区域的房价,模型需要长时间运行,房价预测需要使用前面的模型运行结果,因此需要使用Worker。
    的头像 发表于 04-01 21:55 1035次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>OS</b><b class='flag-5'>开发</b>案例:【<b class='flag-5'>ArkTS</b><b class='flag-5'>类</b><b class='flag-5'>库</b><b class='flag-5'>多线程</b><b class='flag-5'>CPU</b><b class='flag-5'>密集型</b><b class='flag-5'>任务</b>Worker】

    ArkTS语言基础-解析

    ArkTS语言基础是HarmonyOS系统上为应用开发者提供的常用基础能力,主要包含能力如下图所示。 图1 ArkTS语言基础
    发表于 02-20 16:44

    鸿蒙原生应用开发-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

    什么时候要使用多线程

    什么时候要使用多线程cpu密集型:(比如一个while( true ){ i++;})IO密集型:(比如一个从磁盘拷贝数据到另一个磁盘的拷贝进程)1)计算
    发表于 09-06 07:25

    HarmonyOS CPU与I/O密集型任务开发指导

    一、CPU密集型任务开发指导 CPU密集型任务是指需
    发表于 09-26 16:29

    HarmonyOS语言基础开发指南上线啦!

    并发能力,适用于单次I/O任务开发场景。 ○ TaskPool和Worker提供多线程并发能力,适用于CPU
    发表于 10-18 16:36

    鸿蒙APP开发:【ArkTS多线程TaskPool和Worker的对比

    TaskPool任务池)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型
    的头像 发表于 03-26 22:09 592次阅读
    <b class='flag-5'>鸿蒙</b>APP<b class='flag-5'>开发</b>:【<b class='flag-5'>ArkTS</b><b class='flag-5'>类</b><b class='flag-5'>库</b><b class='flag-5'>多线程</b>】<b class='flag-5'>TaskPool</b>和Worker的对比

    鸿蒙OS开发实例:【ArkTS多线程I/O密集型任务开发

    使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程中其它任务的执行,这时需要使用
    的头像 发表于 04-01 16:32 479次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>OS</b><b class='flag-5'>开发</b><b class='flag-5'>实例</b>:【<b class='flag-5'>ArkTS</b><b class='flag-5'>类</b><b class='flag-5'>库</b><b class='flag-5'>多线程</b>I/O<b class='flag-5'>密集型</b><b class='flag-5'>任务</b><b class='flag-5'>开发</b>】

    鸿蒙OS开发实例:【ArkTS多线程@Concurrent装饰器校验并发函数】

    在使用TaskPool时,执行的并发函数需要使用该装饰器修饰,否则无法通过相关校验。从API version 9开始,该装饰器支持在ArkTS卡片中使用。
    的头像 发表于 04-02 14:45 618次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>OS</b><b class='flag-5'>开发</b><b class='flag-5'>实例</b>:【<b class='flag-5'>ArkTS</b><b class='flag-5'>类</b><b class='flag-5'>库</b><b class='flag-5'>多线程</b>@Concurrent装饰器校验并发函数】

    鸿蒙开发:【线程模型】

    管理其他线程ArkTS引擎实例,例如使用TaskPool任务池)创建任务或取消
    的头像 发表于 06-13 16:38 364次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>:【<b class='flag-5'>线程</b>模型】