鸿蒙 harmonyos 线程 并发 总结 async promise Taskpool woker(三)多线程并发 Worker

Worker

Worker是与主线程并行的独立线程。创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。

Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与主线程分离,在后台线程中运行一个脚本操作耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。由于Worker一旦被创建则不会主动被销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的Worker。

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

Worker的上下文对象和主线程的上下文对象是不同的,Worker线程不支持UI操作

Worker注意事项

  • 创建Worker时,传入的Worker.ts路径在不同版本有不同的规则,详情请参见文件路径注意事项。

  • Worker创建后需要手动管理生命周期,且最多同时运行的Worker子线程数量为8个,详情请参见生命周期注意事项。

  • Ability类型的Module支持使用Worker,Library类型的Module不支持使用Worker。

  • 创建Worker不支持使用其他Module的Worker.ts文件,即不支持跨模块调用Worker。

  • 由于不同线程中上下文对象是不同的,因此Worker线程只能使用线程安全的库,例如UI相关的非线程安全库不能使用。

  • 序列化传输的数据量大小限制为16MB。

创建Worker

由于华为主推Stage模型所以这里讲解Stage模型的Woker,构造函数需要传入Worker的路径(scriptURL),Worker文件存放位置默认路径为Worker文件所在目录与pages目录属于同级。

  • 基于Stage模型工程目录结构,写法一的路径含义:

    • entry:module.json5文件中module的name属性对应值。
    • ets:用于存放ets源码,固定目录。
    • workers/MyWorker.ts:worker源文件在ets目录下的路径。
  • 基于Stage模型工程目录结构,写法二的路径含义:

    • @bundle:固定标签。
    • bundlename:当前应用包名。
    • entryname:module.json5文件中module的name属性对应值。
    • ets:用于存放ets源码,固定目录。
    • workerdir/workerfile:worker源文件在ets目录下的路径,可不带文件后缀名。

在pages创建workers文件夹,在workers中创建worker文件,js、ts、ets都可以。本例创建的是ets,为了追求代码统一。

worker通过worker.workerPort与主线程通信,workerPort.onmessage接收来自主线程的数据,workerPort.postMessage向主线程发送消息。

// worker.ts
import worker from '@ohos.worker';// 创建worker线程中与主线程通信的对象
const workerPort = worker.workerPort// worker线程接收主线程信息
workerPort.onmessage = function(e) {// data:主线程发送的信息let data = e.data;console.log("worker.ts onmessage"+data);// worker线程向主线程发送信息workerPort.postMessage("123")
}// worker线程发生error的回调
workerPort.onerror= function(e) {console.log("worker.ts onerror");
}

 配置Woker

需要在build-profile.json5中配置worker路径,配置在buildOption中的sourceOption中添加workers数组,既然是数组就可以添加多个worker

"buildOption": {"sourceOption": {"workers": ["./src/main/ets/workers/worker.ets"]}}

调用Worker

worker.ThreadWorker("path/worker.ts")创建Woker对象,onmessage接收来worker的数据,postMessage向worker发送消息。

import worker from '@ohos.worker';@Entry
@Component
struct Index {@State image: PixelMap | undefined = undefined;@State message: string = 'Hello World';testWoker(){// 主线程中创建Worker对象const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.ts");// 创建js和ts文件都可以// const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.js");// 主线程向worker线程传递信息workerInstance.postMessage("123");// 主线程接收worker线程信息workerInstance.onmessage = function(e) {// data:worker线程发送的信息let data = e.data;console.log("main.js onmessage");// 销毁Worker对象workerInstance.terminate();}// 在调用terminate后,执行onexitworkerInstance.onexit = function() {console.log("main.js terminate");}}build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(()=>{this.testWoker();})}.width('100%')}.height('100%')}}

今天就写到这,下一章讲一下worker其他特性,还有同步问题。

本人创业失败,想找一份鸿蒙开发的工作,招的人私信我。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测算法是指什么?

一、目标检测算法是指什么? 目标检测算法是计算机视觉领域的一个重要分支,它旨在识别和定位图像中的目标对象。以下是目标检测算法的相关内容: 目标检测的核心问题:目标检测需要解决的两个核心问题是“目标是什么”和“目标在哪里…

如何加盟共享wifi项目?了解套路有哪些?

自共享wifi项目推出在市场火爆后,各路资本都看到了该项目的广阔前景,纷纷开始研发程序,想要趁机分一杯羹。但对于普通人而言,独立研发程序显然不大现实,于是,共享wifi项目如何加盟便成为了绝大多数人最为关…

java异常的捕获

Java内置了一套异常处理机制,总是使用异常来表示错误。 一,使用try……catch来捕获错误 异常是一种class,因此它本身带有类型信息。异常可以在任何地方抛出,但只需要在上层捕获,这样就和方法调用分离了: try {Strin…

机器人自动驾驶时间同步进阶

0. 简介 之前时间同步也写过一篇文章介绍机器人&自动驾驶中的时间同步。在最近的学习中发现一些额外需要阐述学习的内容,这里就再次写一些之前没写到的内容。 1. NTP NTP 是网络时间协议,用来同步网络中各计算机时间的协议,把计算机的时…

[计算机效率] 网站推荐:网盘资源类

4.6 网盘资源类 在数字化时代,网盘资源搜索已成为我们日常生活和工作中不可或缺的一部分。无论是寻找工作资料、学习素材,还是娱乐资源,一个高效、可靠的网盘资源搜索网站都能为我们节省大量时间。今天,我将为大家推荐几个优秀的…

【C++类和对象】日期类的实现

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

华为公司战略规划和落地方法之五看三定工具解析【PPT图片】(内含超级福利)

导言 华为公司最厉害之处就是战略上的高举高打,“吹过的牛都实现了”。支撑华为公司战略从规划到落地的主要工具很多,其中“五看三定”是战略规划时最核心的方法之一。本资料将介绍五看三定的核心精髓。欢迎学习! 本材料结合谢宁老师专著《华…

数据结构之顺序表的实现(C语言版)

Hello, 大家好,我是一代,今天给大家带来有关顺序表的有关知识 所属专栏:数据结构 创作不易,望得到各位佬们的互三呦 一.前言 1.首先在讲顺序表之前我们先来了解什么是数据结构 数据结构是由“数据”和“结构”两词组合⽽来。 什…

【Diffusion实战】训练一个diffusion模型生成蝴蝶图像(Pytorch代码详解)

上一篇Diffusion实战是确确实实一步一步走的公式,这回采用一个更方便的库:diffusers,来实现Diffusion模型训练。 Diffusion实战篇:   【Diffusion实战】训练一个diffusion模型生成S曲线(Pytorch代码详解)…

六西格玛管理培训:我的转变与成长之旅

4月初,我参与了天行健咨询的六西格玛管理培训,这次经历不仅极大地提升了我的工作效率,还帮助我在工作中实现了卓越。现在,我想分享一些我在这次培训中的学习心得和实践经验,希望能对正在寻求提升绩效和卓越之路的大家有…

用于车载T-BOX汽车级的RA8900CE

用于车载T-BOX等高精度计时的汽车级时钟模块RTC:RA8900CE.车载实时时钟芯片RA8900CE内置32.768Khz的晶体,实现年、月、日、星期、小时、分钟和秒精准计时。RA8900CE满足AEC-Q200认证,内置温补功能,保证实时时钟的稳定可靠,功耗低至…

【目标检测】YOLO系列-YOLOv1 理论基础 通俗易懂

为方便大家理解YOLO的原理,这里将YOLOv1的部分内容基础内容进行用比较直白的话和例子进行阐述,为后续大家学习YOLO作为铺垫。 1、模型所干的活 工作中,大家经常将 Word 文档 上传到某转换器,然后转换输出为PDF文档。目标检测中我…