鸿蒙 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后,执行onexit
    workerInstance.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其他特性,还有同步问题。

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

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

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

相关文章

C++:特殊成员函数

构造函数、析构函数和拷贝构造函数是C类中的三种特殊成员函数,它们分别用于对象的初始化、清理和拷贝操作。 1.构造函数(Constructor):构造函数在对象创建时自动调用,用于初始化对象的成员变量。它的名称与类名相同&a…

Robbins-Monro(RM)算法【随机近似】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

Unity3d的海盗王地图

一直以来,都想将海盗王的地图搬到手游unity3d上面。 经过漫长时间的研究,终于实现了当初的想法。

「最没存在感」港姐冠军入行10年不受捧,与相恋4年男友分手

昨日(4月21日)一众歌手艺人齐集红馆举行《全港运动全城跃动第九届全港运动会开幕礼》录影,TVB亦派出不少的歌手艺人小花表演。其中一部分是邵珮诗与黄婧灵大跳拉丁舞,同属身材丰满的二人跳起上来视觉极夸张。 而平常经常露出姣好身…

《庆余年》开发衍生短剧,阅文迈向短剧市场的一大步

《庆余年》竟然也要拍短剧了。 据悉,《庆余年》衍生短剧《庆余年之少年风流》预计将于5月1日开机,等了五年都没等到《庆余年2》,没想到先等到了衍生短剧。 由组讯消息可知,《庆余年之少年风流》讲述的是少年庆帝李云潜“扮猪吃老…

小游戏:贪吃蛇

🎁个人主页:我们的五年 🔍系列专栏:贪吃蛇 🌷追光的人,终会万丈光芒 目录 🏝1.头文件: 🏝2.实现文件: 🏝3.测试文件 : 前言&#…

探索 去中心化的Web3.0

随着区块链技术的日益成熟和普及,Web3(Web 3.0)已经成为一个无法忽视的趋势。Web3不仅仅是一个技术概念,更是一个去中心化、透明、用户数据拥有权归还给用户的互联网新时代。在这篇文章中,我们将深入探讨Web3技术的核心…

uniApp项目总结

前言 大半年的时间,项目从秋天到春天,从管理后台到APP再到数据大屏,技术栈从vue3到uniApp再到nuxt3,需求不停的改,注释掉代码都快到项目总体的三分之一。 一,项目技术栈分析 1.1 项目框架 当前&#xf…

30V-STM32设计项目

30V-STM32设计 一、项目描述 (已验证) 基于STM32c8t6芯片设计的开发板,支持4-30V宽电压输入,串口模式自动下载功能,支持串口和STlink,方式下载程序 二、原理图介绍 电源电路采用了DCDCLDO电路,如果是外接DC头供电的话&…

坚蛋运动新质生产力实践——“AI健康”战略引领产品和服务创新

进入AI时代,全球互联网企业均开启了以大模型及其应用为代表的第四次工业革命的激烈竞赛。坚蛋运动已在全国范围内布局300门店,预计实现2024年500、2025年1000门店,作为国内运动健康产业的头部品牌,坚蛋运动率先提出并推动“AI健康…

广州大学《软件工程》实验报告三软件设计

广州大学学生实验报告(三) 开课学院及实验室: 学院 年级/专业/班 姓名 学号 实验课程名称 软件工程导论实验 成绩 实验项目名称 软件设计 指导老师 一、实验目的 掌握软件设计建模技术,能够撰写软件设计文…

判断经济形势最常用的统计指标有哪些

分析判断经济形势常常围绕以下四大目标进行:经济增长、充分就业、物价稳定、国际收支平衡。这四大目标相互联系、相互影响、相互制约,宏观调控的目的在于恰当处理这四方面的关系,寻求一个最佳平衡点。通过全面观察这四大指标,可以…

postCss基本介绍

🌟什么是postCss? 我个人的理解postCss就是css界的babel,它提供一个过程,而在这个过程中,去干什么就是你自己的事情,所以很多人写插件,去做代码转换,或者兼容等等。 babel 提供过程 …

新的全息技术突破计算障碍

一种突破性的方法利用基于Lohmann透镜的衍射模型实时创建计算机生成全息图(CGH),在保持3D可视化质量的同时,大大降低了计算负荷要求。 全息显示为制作逼真的三维图像提供了一条令人兴奋的途径,这种图像给人以连续深度…

Pytest精通指南(26)钩子函数-依赖执行(pytest-dependency)

文章目录 前言应用场景插件安装注意事项参数分析函数名称依赖实现方式类下函数路径实现方式通过设置别名指定依赖定义依赖范围作用于类作用于模块作用于包作用于会话拓展-非常重要 前言 pytest-dependency的主要用途是确保测试用例按照指定的依赖关系顺序执行。 在一个复杂的测…

R语言绘制动态网络图Network教程WGCNA

今天分享的笔记是使用NetworkD3对WGCNA的共表达网络进行可视化,创建交互式动态网络图,展示基因之间的相互关系,可以用于转录组或者其他调控网络展示。 加权基因共表达网络分析 (WGCNA, Weighted correlation network analysis)是用来描述不同…

数值分析复习:Richardson外推和Romberg算法

文章目录 Richardson外推Romberg(龙贝格)算法 本篇文章适合个人复习翻阅,不建议新手入门使用 本专栏:数值分析复习 的前置知识主要有:数学分析、高等代数、泛函分析 本节继续考虑数值积分问题 Richardson外推 命题&a…

Python环境找不到解决方法

Python环境找不到 打开设置:Ctrl Alt S 添加Local Interpreter... 打开System Interpreter,找到本地安装的Python.exe路径,然后一路点OK Trust Project 如果打开工程时,出现如下对话框,请勾选 Trust projects in ...&…

CDN技术:全球化的数字内容快速分发系统

CDN技术:全球化的数字内容快速分发系统 在今天的互联网世界中,内容分发网络(CDN)技术起着至关重要的作用。它通过全球分布的服务器网络,快速、安全地将内容送达世界各地的用户,极大地提升了网页加载速度和…

使用 ollama 部署最新的Llama 3 70B本地模型

一、ollama是什么? 在本地启动并运行大型语言模型。运行Llama 3,Mistral, Gemma, Code Llama和其他模型。自定义并创建您自己的。 综合优点: 快速下载容器自动运行大模型,现在下载,马上上手。本地利用 cpu 运行大模型&#xff0c…