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

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

3天内不再提示

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

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-04-01 21:55 次阅读

使用Worker进行长时间数据分析

通过某地区提供的房价数据训练一个简易的房价预测模型,该模型支持通过输入房屋面积和房间数量去预测该区域的房价,模型需要长时间运行,房价预测需要使用前面的模型运行结果,因此需要使用Worker。

1.DevEco Studio提供了Worker创建的模板,新建一个Worker线程,例如命名为“MyWorker”。

2.在主线程中通过调用ThreadWorker的constructor()方法创建Worker对象,当前线程为宿主线程。

import worker from '@ohos.worker';

const workerInstance = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');

3.在宿主线程中通过调用onmessage()方法接收Worker线程发送过来的消息,并通过调用postMessage()方法向Worker线程发送消息。

例如向Worker线程发送训练和预测的消息,同时接收Worker线程发送回来的消息。

// 接收Worker子线程的结果
workerInstance.onmessage = function(e) {
  // data:Worker线程发送的信息
  let data = e.data;
  console.info('MyWorker.ts onmessage');
}

workerInstance.onerror = function (d) {
  // 接收Worker子线程的错误信息
}

// 向Worker子线程发送训练消息
workerInstance.postMessage({ 'type': 0 });
// 向Worker子线程发送预测消息
workerInstance.postMessage({ 'type': 1, 'value': [90, 5] });

4.在MyWorker.ts文件中绑定Worker对象,当前线程为Worker线程。

import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';

let workerPort: ThreadWorkerGlobalScope = worker.workerPort;

5.在Worker线程中通过调用onmessage()方法接收宿主线程发送的消息内容,并通过调用postMessage()方法向宿主线程发送消息。

例如在Worker线程中定义预测模型及其训练过程,同时与主线程进行信息交互。

import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';

let workerPort: ThreadWorkerGlobalScope = worker.workerPort;

// 定义训练模型及结果 
let result;

// 定义预测函数
function predict(x) {
  return result[x];
}

// 定义优化器训练过程
function optimize() {
  result = {};
}

// Worker线程的onmessage逻辑
workerPort.onmessage = function (e: MessageEvents) {
  let data = e.data
  // 根据传输的数据的type选择进行操作
  switch (data.type) {
    case 0:
    // 进行训练
      optimize();
    // 训练之后发送主线程训练成功的消息
      workerPort.postMessage({ type: 'message', value: 'train success.' });
      break;
    case 1:
    // 执行预测
      const output = predict(data.value);
    // 发送主线程预测的结果
      workerPort.postMessage({ type: 'predict', value: output });
      break;
    default:
      workerPort.postMessage({ type: 'message', value: 'send message is invalid' });
      break;
  }
}

在Worker线程中完成任务之后,执行Worker线程销毁操作。销毁线程的方式主要有两种:根据需要可以在宿主线程中对Worker线程进行销毁;也可以在Worker线程中主动销毁Worker线程。

6.在宿主线程中通过调用onexit()方法定义Worker线程销毁后的处理逻辑。

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

// Worker线程销毁后,执行onexit回调方法
workerInstance.onexit = function() {
  console.info("main thread terminate");
}```
鸿蒙OS开发HarmonyOSOpenHarmony技术
方式一:在宿主线程中通过调用terminate()方法销毁Worker线程,并终止Worker接收消息。
// 销毁Worker线程
workerInstance.terminate();

方式二:在Worker线程中通过调用close()方法主动销毁Worker线程,并终止Worker接收消息。

// 销毁线程
workerPort.close();

审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10901

    浏览量

    212954
  • 多线程
    +关注

    关注

    0

    文章

    278

    浏览量

    20067
  • 鸿蒙OS
    +关注

    关注

    0

    文章

    190

    浏览量

    4531
收藏 人收藏

    评论

    相关推荐

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

    。 基于多线程并发机制处理CPU密集型任务可以提高CPU利用率,提升应用程序响应速度。 当进行一系列同步
    的头像 发表于 02-18 10:17 1002次阅读
    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密集型任务TaskPool】

    CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主
    的头像 发表于 04-01 22:25 898次阅读
    <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>TaskPool】

    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

    鸿蒙原生应用开发-ArkTS语言基础多线程TaskPool和Worker的对比(三)

    是不同的,因此TaskPool工作线程只能使用线程安全的,例如UI相关的非线程安全不能使用。 序列化传输的数据量大小限制为16MB。 二
    发表于 03-27 16:26

    什么时候要使用多线程

    什么时候要使用多线程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 706次阅读
    <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>】TaskPool和<b class='flag-5'>Worker</b>的对比

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

    创建Worker线程称为宿主线程(不一定是主线程,工作线程也支持创建Worker
    的头像 发表于 03-27 15:44 574次阅读
    <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>】TaskPool和<b class='flag-5'>Worker</b>的对比(2)

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

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