OpenHarmony worker详解

一,定义

worker是与主线程并行的独立线程。创建Worker的线程被称为宿主线程,Worker工作的线程被称为Worker线程。创建Worker时传入的脚本文件在Worker线程中执行,通常在Worker线程中处理耗时的操作,需要注意的是,Worker中不能直接更新Page。

worker与java中多线程的概念相似,就是开启一个独立线程,在独立线程中处理耗时任务。

对于处理耗时操作且不阻塞主线程起到了重要的作用,并且多个线程并发可以提高CPU和内存的利用率。在实际开发项目经常遇到网络请求、文件读写、大图片加载等相对耗时的操作,如果这些耗时操作都在主线程中处理,就会导致应用UI界面被卡住,无法操作。但需要注意的是:Worker线程中不能直接操作UI,需要通过消息通知UI线程进行更新,类似于android中的Handler机制。

二,worker运行机制

创建Worker的线程称为宿主线程(不一定是主线程,工作线程也支持创建Worker子线程),worker自身的线程称为Worker子线程(或Actor线程,工作线程)。每个worker子线程与宿主线程拥有独立的实例,包含基础设施,对象,代码段等。Worker子线程和宿主线程之间的通信是基于消息传递的,Worker通过序列化机制与宿主线程之间相互通信,完成命令及数据交互。

三,worker注意事项

1,不可以在library里面创建worker,只能在Ability里面创建worker

2,最多开启8个Worker

3,任务时长无限制

4,woker创建后需要手动管理生命周期

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

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

四,worker使用

1,新建一个worker

2,在ablity下的build-profile.json5里面添加:

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

3,在worker里面接受主线程消息,处理耗时任务,向主线程发送消息:

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


var workerPort : ThreadWorkerGlobalScope = worker.workerPort;


function count5(value) {
  return value*5;
}
function count6(value) {
  return value*6;
}


workerPort.onmessage = function(e : MessageEvents) {
  let data = e.data
  try{
    // 根据传输的数据的type选择进行操作
    switch (data.type) {
      case 0:
        setTimeout(() => {
         // 耗时结束后,向宿主线程发送消息
          workerPort.postMessage({ type: 'message', value: count5(data.value) });
        }, 3000);
        break;
      case 1:
        setTimeout(() => {
          // 耗时结束后,向宿主线程发送消息
          workerPort.postMessage({ type: 'message', value: count6(data.value) });
        }, 3000);
        break;
    }
  }
}


workerPort.onmessageerror = function(e : MessageEvents) {
  // Worker对象接收到一条无法被序列化的消息时被调用的事件处理,主线程执行
}

workerPort.onerror = function(e : ErrorEvent) {
  // 属性表示Worker在执行过程中发生异常被调用的事件处理程序,worker线程执行
}

4,主线程发送消息到worker线程,并接受worker线程的消息:


import worker from '@ohos.worker';

@Component
struct WorkerUseView {

  
  @State result:number =0 ;
  wk:worker.ThreadWorker =null

  aboutToAppear(){
    //创建worker线程
    this.wk = new worker.ThreadWorker("entry/ets/worker.ts");
    this.wk.onmessage=function(message){
      let data = message.data;
      this.result =data.value
    }.bind(this)
  }


  aboutToDisappear(){
    //销毁worker线程
    this.wk.terminate();
  }

  build() {
    Column(){
     
      Button('子线程计算90*5 模拟3s')
        .onClick(()=>{
          // 发送消息到worker线程
          this.wk.postMessage({ 'type': 0 ,'value': 90})
        })
        .margin(10)
      Button('子线程计算90*6 模拟3s')
        .onClick(()=>{
          // 发送消息到worker线程
          this.wk.postMessage({ 'type': 1 ,'value': 90})
        })
        .margin(10)
      Text("子线程计算结果:"+this.result)
    }.width("100%").height("100%")
  }
}

五,总结

worker的使用与安卓中hander的使用非常相似,我们可以把长时间的轮询,定时等任务放到worker里面去执行。

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

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

相关文章

Jenkins的介绍与相关配置

Jenkins的介绍与配置 一.CI/CD介绍 1.CI/CD概念 ①CI 中文意思是持续集成 (Continuous Integration, CI) 是一种软件开发流程,核心思想是在代码库中的每个提交都通过自动化的构建和测试流程进行验证。这种方法可以帮助团队更加频繁地交付软件&#x…

TikTok影响力经济:解锁社交媒体的商业机遇

社交媒体平台的崛起改变了我们与世界互动的方式,而TikTok作为其中的一员,已经成为全球范围内的现象。这个短视频应用不仅让用户在几秒钟内分享创意和娱乐,还为企业和创作者提供了巨大的商业机会。本文将深入探讨TikTok的影响力经济&#xff0…

OpenCV 实现透视变换

一:OpenCV透视变换的概念 仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常,在2D平面中,仿射变换的应用较多,而在3D平面中,透视变换又有了自己的一席之…

接口自动化测试操作流程

接口自动化大致步骤: 1、发送请求 2、解析结果 3、验证结果 定义三个和业务相关的类 1、一个用来封装HTTPclient,用来发送请求 2、解析结果xml的类 3、一个用于比较测试结果和期望值的类,用于验证 4、自动生成报告的类:自…

sqlite expert数据库导入编辑好的表格

一、前言 此功能不常用,但是又非常重要,每次想要用忘记了方法还得上网搜索,这里自己记录一下,方便以后查看,也帮助大家快速使用 二、环境 window sqlite3 三、正文 步骤一:在数据库创建空表格&#x…

2023年云计算的发展趋势

随着互联网和信息技术的快速发展,云计算已经成为了企业和个人的重要工具,而在未来,云计算仍然会持续发展,并且发展趋势会更加迅猛。在本文中,我们将讨论2023年云计算的发展趋势。 一、混合云将成为主流 混合云是指将公…

《Linux从练气到飞升》No.26 Linux中的线程控制

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

燃气管网监测系统|全面保障燃气安全

根据新华日报的报道,2023年上半年,我国共发生了294起燃气事故,造成了57人死亡和190人受伤,燃气事故的发生原因有很多,其中涉及到燃气泄漏、设备故障等因素。因此,加强燃气安全管理,提高城市的安…

一文让你了解网络刷卡器的特点和优势

网络刷卡器一款高性能的多协议电子标签读写器,保持高识读率的同时实现对电子标签的快速读写处理,广泛应用于物流追踪、个人身份识别、人员管理、智能停车场、门禁考勤、公交一卡通、餐饮、金融等多个领域。 特点和优势: 1)低功耗、…

python 路径变更后 pip 运行报错

python 路径变更后 pip 运行报错 Fatal error in launcher: Unable to create process using "d:\python-3.6.6\python .exe" "D:\python-3........出现这种原因是因为生产 Scripts\pip.exe中存在绝对路径,因此当python变更过路径后所有 Scripts目…

新型的铁塔基站“能源管家”

安科瑞 崔丽洁 引言:随着5G基站的迅猛发展,基站的能耗问题也越来越突出,高效可靠的基站配电系统方案,是提高基站能耗使用效率,实现基站节能降耗的重要保证,通过多回路仪表监测每个配电回路的用电负载情况&a…

微信小程序广告banner、滚动屏怎么做?

使用滑块视图容器swiper和swiper-item可以制作滚动屏&#xff0c;代码如下&#xff1a; wxml: <swiper indicator-dots indicator-color"rgba(255,255,255,0.5)" indicator-active-color"white" autoplay interval"3000"><swiper-ite…

VR全景技术在城市园区发展中有哪些应用与帮助

引言&#xff1a; 在数字化时代的浪潮中&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术逐渐融入各个领域&#xff0c;也为城市园区展示带来了全新的可能性。 一&#xff0e;VR全景技术简介 虚拟现实全景技术是一种通过全景图像和视频模拟真实环境的技术。通过相关设…

一篇文章搞明白js运行机制——事件循环

1、解释 JavaScript 的执行机制。 JavaScript 的执行机制基于事件循环。事件循环包括一个任务队列&#xff08;Task Queue&#xff09;和一个微任务队列&#xff08;Microtask Queue&#xff09;。当一个函数被调用时&#xff0c;它被添加到微任务队列中。事件循环每次迭代都会…

腾讯云轻量应用服务器优惠购买攻略,怎么购买腾讯云优惠划算?

腾讯云轻量应用服务器&#xff08;Lighthouse&#xff09;是一款专为中小型企业和个人开发者打造的云服务器产品。它具备简单易用、成本低廉和高性能等特点&#xff0c;为用户提供了便捷高效的云服务器解决方案。 腾讯云轻量应用服务器采用了简单直观的图形化界面&#xff0c;…

linux grub2 不引导修复 grub2-install:error:/usr/lib/grub/x86_64-efi/modinfo.sh

系统部署在物理机上&#xff0c;开机后一直pxe不进系统&#xff0c;怀疑GRUB丢失。 查看bios 里 采用uefi 启动方式&#xff0c; 无硬盘系统引导选项&#xff0c; 且BMC设置为硬盘永久启动也无效。 挂载光驱ISO进入救援模式,sda为系统盘&#xff0c;重装grub报错 grub2-inst…

ProtoBuf的学习和使用(C++)

ProtoBuf的学习和使用---C ⼀、初识ProtoBuf序列化和反序列化的概念ProtoBuf是什么?ProtoBuf工作特点 二、主要学习思路三、快速上手四、proto3语法详解1.字段规则2.消息类型的定义与使⽤实际操练 3.enum枚举类型enum注意事项enum实操 4.Any类型Any类型实操 5.oneof类型oneof类…

FTP网络问题排查

Linux探测路径MTU&#xff1a; ping大包&#xff1a; [test]$ ifconfig eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1280 [test]$ ping -M do -s 1252 172.18.98.3 PING 172.18.98.3 (172.18.98.3) 1252(1280) bytes of data. 1260 bytes from 172.18.98.3: …

早上好问候语,清晨阳光暖心的早安问候语录

1、在我们每一个人的生命里&#xff0c; 会遇到各种各样的陪伴。陪伴很温暖&#xff0c; 相识不易&#xff0c;陪伴更是一种缘分&#xff01;祝福每一位朋友&#xff0c; 在人生的岁月里都能相伴而行&#xff0c; 一起度过美好的快乐时光&#xff01; 2、天天问候&#xff0c;真…

日志及其框架

日志技术的概述 日志 生活中的日志&#xff1a; 生活中的日志就好比日记&#xff0c;可以记录你生活的点点滴滴。 程序中的日志&#xff1a; 程序中的日志可以用来记录程序运行过程中的信息&#xff0c;并可以进行永久存储。 以前记录日志的方式&#xff08;输出语句&#…