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

 使用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开发开发知识更新库qr23.cn/AKFP8k### 参考前往。HarmonyOS与OpenHarmony技术
方式一:在宿主线程中通过调用terminate()方法销毁Worker线程,并终止Worker接收消息。
// 销毁Worker线程
workerInstance.terminate();

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

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

鸿蒙Next核心技术分享

1、鸿蒙基础知识←《鸿蒙NEXT星河版开发学习文档》

2、鸿蒙ArkUI←《鸿蒙NEXT星河版开发学习文档》

3、鸿蒙进阶技术←《鸿蒙NEXT星河版开发学习文档》

 4、鸿蒙就业高级技能←《鸿蒙NEXT星河版开发学习文档》 

 5、鸿蒙多媒体技术←《鸿蒙NEXT星河版开发学习文档》 

6、鸿蒙南向驱动开发←《鸿蒙NEXT星河版开发学习文档》  

7、鸿蒙南向内核设备开发←《鸿蒙NEXT星河版开发学习文档》  

 8、鸿蒙系统裁剪与移植←《鸿蒙NEXT星河版开发学习文档》  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/507928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)

目录 前言 函数重载 概念 重载函数的条件 C支持重载函数的原理--名字修饰 引用 概念 特性 常引用(const引用) 使用场景 传值,传引用效率比较 引用和指针的区别 内联函数 概念 特性 auto关键字(C11) a…

golang grpc和protobuf的版本降级问题(version4 -> version3)

最后更新于2024年3月28日 10:57:52 简中没查到类似的文章。一点小事闹麻了,搞了一天,特意发出来造福大家。 所谓的版本就是下面这个东西proto.ProtoPackageIsVersion4或者proto.ProtoPackageIsVersion3: 目的 为了适配旧代码&#xff0c…

C语言之位段

1.位段的声明 位段的声明和结构是类似的,有两个不同: 1.位段的成员必须是 int、unsigned int 或signed int 。 2.位段的成员名后边有一个冒号和一个数字。 比如: struct A {int _a:2;int _b:5;int _c:10;int _d:30; }; A 就是一个位段类型…

阿里云服务器安装SSL证书不起作用的解决方案

阿里云服务器安装SSL证书不起作用的解决方案 在阿里云安装SSL证书后,访问无效,各种检查证书安装没有问题。忽然想到阿里云默认连80端口都没开启,443端口应该也没开启。 登录阿里云控制台 - 云服务器 ECS - 网络与安全 - 安全组 - 管理规则 - …

【Redis】Redis 内存管理,Redis事务,bigkey和hotkey

目录 Redis 内存管理 缓存数据设置过期时间? Redis 是如何判断数据是否过期的呢? 过期删除策略 内存淘汰机制 主从模式下对过期键的处理? LRU和LFU的区别 Redis事务 定义和原理 Redis 事务的注意点? 为什么不支持回滚&a…

C++析构函数

当对象的生存期结束时,系统就会自动执行析构函数清除其数据成员所分配的内存空间。 析构函数的定义格式为: ~类名();//没有返回值,没有参数 注: (1)析构函数名是由“~”加类名组成的。 (2&#…

[HackMyVM]靶场Flossy

难度:Medium kali:192.168.56.104 靶机:192.168.56.142 端口扫描 ┌──(root㉿kali2)-[~/Desktop] └─# nmap 192.168.56.142 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-01 21:01 CST Nmap scan report for 192.168.56.142 Host is up (0.00018s latency).…

linux shell命令(进程管理、用户管理)

一、进程的概念 主要有两点: 1.进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)…

ASCII编码的全面介绍

title: ASCII编码的全面介绍 date: 2024/4/1 20:05:52 updated: 2024/4/1 20:05:52 tags: ASCII定义编码原理编码表结构扩展编码应用场景优势与局限安全考量 1. ASCII编码的定义和历史 ASCII(American Standard Code for Information Interchange)是一…

Linux安装JDK及配置环境变量保姆级教程

文章目录 前言一、JDK下载一、Linux安装JDK及配置环境变量1.创建JDK的安装目录2.上传下载好的JDK安装包3.解压缩4.配置环境变量(根据自己jdk的实际安装位置进行配置)5.加载配置文件6.查看java版本(此时jdk就已将安装完成) 前言 JD…

基于SSM+Jsp+Mysql的固定资产管理系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

嵌入式网络硬件方案

一. 简介 本文来了解一下嵌入式有些网络中,涉及的网络硬件方案。 注意:本文说明的是有些网络。 提起网络,我们一般想到的硬件就是“网卡”,“网卡”这个概念最早从电脑领域传出来,顾名思义就是能上网的卡。在电脑领…

UE4_动画基础_ 瞄准偏移1D(Aim Offset Blend Space 1D)

瞄准偏移1D基本上可以完成角色的向左看向右看或者向上看向下看,像混合空间1D一样只有一个轴向可用。 操作步骤: 1、新建第三人称模板项目。 2、右键——动画——瞄准偏移1D 选取骨骼 双击打开 3、瞄准偏移混合的是姿势,我们需要创建姿势。 …

ALPHA开发板上PHY网络芯片LAN8720

一. 简介 正点原子的开发板 ALPHA开发板,有线网络硬件方案所使用的也是最常用的一种方案,IMX6ULL芯片内部是自带 MAC网络芯片的,所以,也就是采用 "SOC内部集成网络MAC外设 PHY网络芯片方案"。 ALPHA开发板使用的PHY网…

编程新手必看,Pycham开发工具使用及项目创建(3)

介绍:PyCharm是一款由JetBrains开发的专业Python集成开发环境(IDE)。 PyCharm为Python开发者提供了一整套工具,以提高编程效率和改善代码质量。以下是其主要特点和功能: 代码编辑与智能提示:具备高级代码编…

Java 堆外内存及调优

文章目录 直接内存简介为什么DirectByteBuffer可以优化 IO 性能 直接内存的分配直接内存的回收直接内存跟踪与诊断 直接内存简介 直接内存(Direct Memory) 并不是虚拟机运行时数据区的一部分,并非Java虚拟机规范中定义的内存区域。但是这部分内存的频繁使用&#x…

Vue.js高效前端开发(增删查)

效果图 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"app"><span>ID</span><input type"text" name"…

javaWeb项目-家政服务管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、B/S结构简介 B/S…

unity学习(80)--disposed object

1.在正常运行的过程中&#xff0c;客户端崩溃&#xff0c;原因就是某个对象null或者被disposed了 2.找了找&#xff0c;发现socket确实调用过一次close 3.把close去掉修改为如下&#xff0c;客户端不再崩溃&#xff0c;虽然还有异常。

如何快速生成视频二维吗?视频用二维码播放的方法

视频的二维码如何制作会更加简单呢&#xff1f;通过扫码播放视频的方式现在越来越多&#xff0c;很多小伙伴也喜欢用这种方式来将视频分享给其他人。将视频储存到云端储存之后&#xff0c;通过扫描二维码在手机上浏览器视频&#xff0c;更加的方便快捷。 现在视频生成二维码可…