鸿蒙笔记--WorkerTaskPool

news2024/11/13 9:33:34

        这一节了解一下鸿蒙中的Worker和TaskPool,Worker和TaskPool的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。

1 Worker        

      Worker 线程是与主线程并行的独立线程,其主要作用是为应用程序提供一个多线程的运行环境来处理耗时任务从而避免阻塞主线程的运行。创建 Worker 的线程称之为宿主线程,Worker自身的线程称之为 Worker 线程,创建 Worker 传入的 url 文件在 Worker 线程中执行,Worker 线程创建后不会主动销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的 Worker;创建Worker的线程称为宿主线程(不一定是主线程,工作线程也支持创建Worker子线程),Worker自身的线程称为Worker子线程(或Actor线程、工作线程)。每个Worker子线程与宿主线程拥有独立的实例,包含基础设施、对象、代码段等,因此每个Worker启动存在一定的内存开销,需要限制Worker的子线程数量。Worker子线程和宿主线程之间的通信是基于消息传递的,Worker通过序列化机制与宿主线程之间相互通信,完成命令及数据交互。

Worker在鸿蒙中的优点:
1 多线程运行环境:
Worker为应用程序提供了多线程的运行环境,使得应用程序能够在与主线程分离的后台线程中执行耗时操作。
适合于处理计算密集型或高延迟的任务,如大数据处理、复杂算法运算等,从而释放主线程以处理用户交互和其他即时任务。
2 避免主线程阻塞:
由于Worker在独立的线程中运行,因此不会因执行耗时操作而阻塞主线程,这有助于保持应用程序的响应性和流畅性。
3 内存模型安全:
Worker线程之间以及Worker线程与宿主线程之间的内存是不共享的,每个Worker线程拥有独立的实例,包含基础设施、对象、代码段等,从而保证了操作的安全性。
4 通信机制稳定:
Worker与宿主线程之间通过消息传递进行通信,使用序列化机制完成命令及数据交互,确保了稳定的数据传输。

Worker在鸿蒙中的缺点:
1 生命周期管理:
开发者必须手动管理Worker的生命周期,包括创建和销毁操作,这可能会增加开发的复杂性。
2 线程数量限制:
在任何时候,一个进程最多只能拥有8个同时运行的Worker线程,这个数量的限制可能会影响应用程序处理大量并发任务的能力。
3不支持任务优先级:
Worker不支持设置任务的优先级,这在一些需要区分任务执行优先级的场景中可能是一个缺陷。

栗子:

在 entry 的 ets 目录下创建 worker 目录,然后在 worker 目录下创建 worker.ts 文件,内容如下:

import worker from '@ohos.worker';
let TAG = "WORKER_THREAD";
const workerPort = worker.workerPort;
//监听宿主线程发送过来的消息
workerPort.onmessage = function (data) {
  // 模拟一个耗时任务
  setTimeout(() => {
    workerPort.postMessage("Hello, Worker, I'm child thread");
  }, 2000);
}
// 监听异常情况
workerPort.onmessageerror = function (error) {
  console.log(`${TAG}, workerPort.onmessageerror: ` + JSON.stringify(error));
}

配置:
在 entry 目录下的 build-profile.json5 文件的 buildOption 项中添加对 worker 的配置,否则不起作用,配置代码如下:

{
  "apiType": 'stageMode',
  "buildOption": {                        // buildOption 下添加
    "sourceOption": {                     // sourceOption 下添加
      "workers": [                        // worker 文件的路径集
        "./src/main/ets/worker/worker.ts" // 路径一定要配置正确
      ]
    }
  }
}

宿主端代码:

import worker from '@ohos.worker';

let TAG = "MAIN_THREAD";
let URL = "entry/ets/worker/worker.ts";

@Entry @Component struct Index {

  @State message: string = 'Hello World';
  private workerInstance: worker.ThreadWorker;
  private initWorker() {
    this.workerInstance = new worker.ThreadWorker(URL, {
      name: "WORKER_THREAD"
    })
  }
  private monitorMessage() {
    this.workerInstance.onmessage = function (data) {
      console.log(`${TAG}, workerInstance.onMessage: ` + JSON.stringify(data));
    }
  }
  private sendMessage() {
    this.workerInstance.postMessage("Hello, Worker, I'm main thread");
  }
  private destroyWorker() {
    this.workerInstance.terminate();
  }

  build() {
    Column({space: 8}) {
      Button("Init Worker")
        .height(80)
        .fontSize(20)
        .onClick(() => {
          this.initWorker();
        })

      Button("Monitor Worker Message")
        .height(80)
        .fontSize(20)
        .onClick(() => {
          this.monitorMessage();
        })

      Button("Send Worker Message")
        .height(80)
        .fontSize(20)
        .onClick(() => {
          this.sendMessage();
        })

      Button("Destroy Worker")
        .height(80)
        .fontSize(20)
        .onClick(() => {
          this.destroyWorker();
        })
    }
    .width('100%')
    .height('100%')
    .padding(20)
  }
}

2 TaskPool

        ArkUI 开发框架在 @ohos.taskpool 模块里提供了多线程的运行环境,作用和其它语言里的线程池一样,都是为了降低资源的消耗、提高系统的性能且无需关心线程实例的生命周期.

TaskPool优点:
1 提高系统性能:
TaskPool通过管理和调度多个工作线程来降低整体资源消耗,从而提高系统的整体性能。
当待执行的任务数量多于工作线程时,TaskPool会根据负载均衡机制自动扩容,增加工作线程以减少整体等待时长。
相反,当活跃任务数量减少,空闲工作线程过多时,TaskPool会自动缩减工作线程数量,以优化资源利用。
2 简化线程管理:
开发者无需关心线程实例的生命周期管理,TaskPool负责创建和销毁工作线程,简化了并发编程的复杂性。
3 灵活控制任务:
开发者可以创建数量不受限制的任务(尽管由于内存限制不建议过量创建),并且可以对任务进行执行、取消等操作。
TaskPool支持为任务设置不同的优先级,满足不同场景下对任务执行顺序的精细控制需求。
4 支持大规模数据传输:
TaskPool API支持大规模的数据传输,虽然存在数据量大小的限制(如16MB),但对于大多数应用来说已经足够使用。
5 易于错误处理:
TaskPool API以数字形式返回错误码,便于开发者识别和处理错误情况,提高了问题诊断的效率。
TaskPool缺点:
1 不适宜执行阻塞操作:
不建议在TaskPool中执行阻塞操作,尤其是无限期的阻塞操作,因为这会占用工作线程,可能导致其他任务调度受阻,影响应用性能。
2 任务优先级管理复杂:
虽然TaskPool支持任务优先级设置,但在大量任务和复杂的优先级管理需求面前,可能会增加管理和调试的难度。
3 错误处理机制有限:
虽然有错误码返回,但TaskPool的错误处理机制相对有限,对于复杂的异常情况可能需要开发者自行实现更细致的处理逻辑。
4 任务无法重复执行:
一旦任务被执行,就无法在TaskPool中重复使用相同的任务实例进行多次执行,这限制了任务的复用性。

栗子:

@Entry 
@Component 
struct TaskPoolTest {
  build() {
    Column({space: 10}) {
      Button("Create Task")
        .onClick(() => {
          taskPoolTest();
        })
    }
    .width("100%")
    .height("100%")
    .padding(10)
  }

}

async function taskPoolTest() {
  let task = new taskpool.Task(func, "create task, then execute");
  let val1 = await taskpool.execute(task);
  console.log("taskpool.execute(task) result: " + val1);
  let val2 = await taskpool.execute(func, "execute task by func");
  console.log("taskpool.execute(function) result: " + val2);
}

@Concurrent
function func(args) {
  console.log("func: " + args);
  return args;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python动画:manim中的颜色【ManimColor】的使用方法

一,什么是彩色(颜色) Color是视觉艺术不可或缺的一部分,但我们怎么知道它如此重要呢?嗯,一种方法是通过色彩理论的应用。什么是色彩理论?我们将定义色彩理论,然后分解来自绘画、照片和电影的各种色彩理论示…

活动预告 | Global RAG Hack Together Ⅲ-用VS Code AI Tools结合SLM构建RAG应用

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun 九月,Global RAG Hack Together 即将在全球开启,在这场全球 RAG 黑客松中,我们不仅可以学习到生成式 AI 下的 RAG 技术,还可以用我们掌握的 RAG 技术提交参…

python读取calibre的opf文件到表格

opf文件之一: python 将 Calibre Library 里面所有opf文件的title,creator,date,description,language,subject内容写入表格中,其中opf之一如上,表头对应为:标题&#xf…

豆包大模型升级:日均Tokens使用量破5000亿,字节跳动打造即刻体验的《Her》式AI

ChatGPT 发布近两年后,全球掀起了一场大模型竞赛,如今怎么将大模型落地,成为萦绕在每一家 AI 公司的最大命题。 最近有媒体统计,自从 GPT-3.5 上线以来,中国新成立的 AI 公司已经有近 8 万家陷入注销、吊销或停业异常…

【前端】vue数据监测原理

问题展示: 点击按钮之后,vue中的persons数据改变,但是页面显示的内容没变。(先点击按钮再打开vue的数据面板可以看见改变,先打开后点击数据面板也不能显示改变。) 此时的更新代码: methods:{…

AI副业:别只顾刷黑神话悟空!AI做神话账号,商单月入过万(附教程)

前言 国产3A大作《黑神话:悟空》一经发布,瞬间登顶steam榜首,打破单机游戏在线记录,全球几十万国外玩家听着中文配音,看着翻译过来的英文字幕,玩的不亦乐乎! 甚至国外论坛上兴起了一股西游风&a…

eBest AI 大模型:智能化引领快消新未来

在快消品行业的高速变化中,数据与知识的管理、分析和应用变得至关重要。面对着日益增长的市场需求和顾客个性化的体验期望,如何利用技术提升效率、增强客户互动和优化销售策略?eBest GPT Hub,一个专为快消行业打造的AI大模型平台&…

第二节:Nodify 添加节点到编辑器中

引言 上节说到Nodify有三层结构,编辑器Editor,节点Node和连接组件Connection,下面就让我们来进行第一步尝试,在编辑器中添加一个节点。 在窗口中添加nodify命名空间,并添加控件。 xmlns:nodify"https://miroiu.…

docker 多线成服务,比如gunicorn服务启动报错解决办法

docker执行的时候报错,排查是线程创建权限不足导致的,报错如下。 解决办法 docker run -e OPENBLAS_NUM_THREADS1 your_image

淘宝商品评论API:评价内容中的关键词搜索与筛选

淘宝商品评论API为开发者提供了强大的工具,用于获取淘宝商品的评论信息,包括评价内容、评论评分、评论时间等。在评价内容中进行关键词搜索与筛选,是电商数据分析、用户行为研究以及商品质量监控等场景下的重要需求。以下是对这一过程的详细解…

EasyCVR视频汇聚平台革新播放体验:WebRTC协议赋能H.265视频流畅传输

随着科技的飞速发展和网络技术的不断革新,视频监控已经广泛应用于社会各个领域,成为现代安全管理的重要组成部分。在视频监控领域,视频编码技术的选择尤为重要,它不仅关系到视频的质量,还直接影响到视频的传输效率和兼…

智领云开源KDP:深度剖析其与主流数据平台的性能与特性对比

本文由智领云 LeetTools 工具自动生成 申请试用: https://www.leettools.com/feedback/ 在当今快速发展的技术环境中,数据平台的选择对企业的数字化转型和业务发展至关重要。本文将重点分析智领云开源KDP与其他数据平台的比较,探讨其在大数据…

[000-01-022].第03节:RabbitMQ环境搭建

我的后端学习大纲 RabbitMQ学习大纲 1.rpm包方式搭建: 1.1.搭建RabbitMQ单体架构: 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下: 3.安装MQ需要先有Erlang语言环境,安装文件的Linux命令(分别按照以下顺序安装…

【多线程基础】Java线程的六种状态

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:Java多线程 📚本系列文章为个人…

重生奇迹MU 冲锋在前近战职业

刀光剑影,近战搏杀的乐趣是热爱近战职业的玩家享受最强体验。重生奇迹MU中有很多近战职业,每个职业都拥有独特的技能和玩法,在战斗中表现也各不相同。选择近战职业的玩家都是英勇者,敢于冲锋陷阵,迎击敌人,…

【CSP:202303-2】垦田计划(Java)

题目链接 202303-2 垦田计划 题目描述 求解思路 直接模拟:创建一个数组arr[],a[i]用来记录将第i天缩短所需要的资源数。在读取数据的时候直接对数组进行初始化。maxTime表示资源优化之前需要花费的最大天数。需要注意:在进行优化遍历时&am…

秋招力扣Hot100刷题总结——滑动窗口

1. 无重复字符的最长子串(手撕频率非常高) 题目要求:给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。 代码及思路 使用一个hashmap维护已经出现过的字符遍历字符串,当字符已经存在时,根…

微服务实战系列之玩转Docker(十二)

前言 山一程,水一程,身向榆关那畔行,夜深千帐灯。——清纳兰性德 最近偶读纳兰的《长相思》经典之作,被这个“行军”场面震撼了。长长的队伍,跋山涉水,野宿一处。夜深人静的时候,突然激发了纳兰…

CSS3页面布局-三栏-固定宽度布局

布局的基本概念 多栏布局三种基本实现方案:固定宽度,流动,弹性。 固定宽度布局:大小不会随用户调整浏览器窗口大小。 一版960-1100,960常见,可以被3,4,5,6,8,10,12,16整除。 流动布局:大小会随用户调整…

芯片要火不要“热”!仿真技术助力芯片热设计

芯片散热仿真好比一场微观世界里的“清凉大作战”! 想象一下,小小的芯片就像迷你城市,无数的电子如同居民在其中穿梭。当芯片高速运转,就像城市进入了狂欢,热闹非凡但也会产生大量的热量。 而芯片散热仿真用数字和算法…