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

news/2024/11/30 6:44:06/

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.ppmy.cn/news/1431241.html

相关文章

AI检索增强生成引擎-RAGFlow-深度理解知识文档,提取真知灼见

💡 RAGFlow 是什么? RAGFlow是一款基于深度文档理解构建的开源RAG(Retrieval-Augmented Generation)引擎。RAGFlow个人可以为各种规模的企业及提供一套专业的RAG工作流程,结合针对用户群体的大语言模型(LL…

力扣经典150题第三十五题:螺旋矩阵

目录 力扣经典150题第三十五题:螺旋矩阵引言题目详解解题思路代码实现示例演示复杂度分析总结扩展阅读 力扣经典150题第三十五题:螺旋矩阵 引言 本篇博客介绍了力扣经典150题中的第三十五题:螺旋矩阵。题目要求按照顺时针螺旋顺序遍历给定的…

华纳云:怎么防止租用服务器的数据丢失?

要防止租用服务器上的数据丢失,可以采取以下一些措施: 定期备份数据:建立定期备份数据的机制,将重要数据备份到安全的地方,例如云存储服务、外部硬盘或者另一个服务器上。备份频率可以根据数据的重要性和变动频率来确定…

[Kotlin]引导页

使用Kotlin Jetpack Compose创建一个左右滑动的引导页, 效果如图. 1.添加依赖项 androidx.compose.ui最新版本查询:https://maven.google.com/web/index.html com.google.accompanist:accompanist-pager最新版本查询:https://central.sonatype.com/ 确保在 build.gradle (M…

[Linux][多线程][二][线程互斥][互斥量][可重入VS线程安全][常见锁概念]

目录 1.线程互斥1.互斥相关背景概念2.多个线程并发的操作共享变量,会带来一些问题3.互斥量mutex 2.互斥量的接口1.初始化互斥量2.销毁互斥量3.加锁4.解锁5.使用 -- 改善上面代码 3.互斥量实现原理探究1.加锁是如何保证原子性的?2.如何保证锁是原子性的&a…

Unity的Animator Animation的使用攻略

Animator 动画控制器 Animation 动画 动画片段 .anin 一、创建Animator 创建动画控制器 模型添加Animator组件 把控制器和模型绑定 二、创建动画 进入动画界面 创建动画片段anin 动画窗口分析 制作动画 点击录制, 移动子对象,在视窗 通过移动线来编辑关…

Linux使用Docker部署DashDot访问本地服务器面板

文章目录 1. 本地环境检查1.1 安装docker1.2 下载Dashdot镜像 2. 部署DashDot应用 本篇文章我们将使用Docker在本地部署DashDot服务器仪表盘,并且结合cpolar内网穿透工具可以实现公网实时监测服务器系统、处理器、内存、存储、网络、显卡等,并且拥有API接…

项目大集成

一 keeplived 高可用 192.168.11.11nginx keeplived192.168.11.12nginx keeplived 两台均编译安装服务器 1 主服务器修改文件: 2 备服务器修改文本 scp keepalived.conf 192.168.11.12:/etc/keepalived/ 3 给主服务器添加虚拟ip ifconfig ens33:0 192.168…