鸿蒙编程江湖:深入理解TaskPool和Worker的并发任务执行

【鸿蒙实战开发】基于Taskpool的多线程操作 周期性任务处理,业务通过taskpool周期性处理业务。:延迟业务处理,业务一段时间后,通过taskpool处理业务。:串行业务处理,业务开展过程中,需要处理一系列的事务,事务处理过程中,存在先后次序。:业务的处理存在紧急优先次序,支持设置taskpool优先级处理。:ArkTS与Native协作开展业务,在ArkTS层触发业务,通过NAPI接口,传递到Native C++层,作业务管理等处理。方案:1)定时器判断周期性事务执行。2)Taskpool来处理任务执行。 阅读详情

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

鸿蒙系统提供了两种并发能力:TaskPool 和 Worker。它们都基于 Actor 并发模型实现,但它们的使用场景和功能有所不同。

  • TaskPool:TaskPool 是一个多线程运行环境,它提供了任务的执行、取消、优先级设置等功能。TaskPool 适用于独立任务,例如计算密集型任务、I/O 密集型任务等。
  • Worker:Worker 是一个可以长时间运行的后台线程,它支持与宿主线程之间的消息传递。Worker 适用于长时间运行的任务,例如后台数据处理、模型训练等。

TaskPool 和 Worker 的区别与使用场景

特性TaskPoolWorker
内存模型线程间隔离,内存不共享线程间隔离,内存不共享
参数传递机制采用标准的结构化克隆算法(Structured Clone)进行序列化、反序列化,完成参数传递。支持 ArrayBuffer 转移和 SharedArrayBuffer 共享。采用标准的结构化克隆算法(Structured Clone)进行序列化、反序列化,完成参数传递。支持 ArrayBuffer 转移和 SharedArrayBuffer 共享。
参数传递直接传递,无需封装,默认进行 transfer。消息对象唯一参数,需要自己封装。
方法调用直接将方法传入调用。在 Worker 线程中进行消息解析并调用对应方法。
返回值异步调用后默认返回。主动发送消息,需在 onmessage 解析赋值。
生命周期TaskPool 自动管理生命周期,无需关心任务负载高低。开发者自行管理 Worker 的数量及生命周期。
任务池个数上限自动管理,无需配置。同个进程下,最多支持同时开启 64 个 Worker 线程,实际数量由进程内存决定。
任务执行时长上限3 分钟(不包含 Promise 和 async/await 异步调用的耗时,例如网络下载、文件读写等 I/O 任务的耗时),长时任务无执行时长上限。无限制。
设置任务的优先级支持配置任务优先级。不支持。
执行任务的取消支持取消已经发起的任务。不支持。
线程复用支持。不支持。
任务延时执行支持。不支持。
设置任务依赖关系支持。不支持。
串行队列支持。不支持。
任务组支持。不支持。
使用场景:
  • TaskPool:适用于独立任务,例如计算密集型任务、I/O 密集型任务等。
  • Worker:适用于长时间运行的任务,例如后台数据处理、模型训练等。

TaskGroup 的管理与任务优先级

TaskGroup:TaskGroup 是一个任务集合,可以将多个任务添加到 TaskGroup 中,并一起执行。TaskGroup 支持配置任务的优先级。
示例:

import { taskpool } from '@kit.ArkTS';
@Concurrent
function add(num1: number, num2: number): number {
  return num1 + num2;
}
@Concurrent
function subtract(num1: number, num2: number): number {
  return num1 - num2;
}
async function concurrentFunc() {
  const task1 = new taskpool.Task(add, 1, 2);
  const task2 = new taskpool.Task(subtract, 3, 4);
  const group = new taskpool.TaskGroup();
  group.addTask(task1);
  group.addTask(task2);
  group.addTask(task1); // 添加重复任务
  await taskpool.execute(group, taskpool.Priority.HIGH);
}

任务优先级:

  • Priority.IDLE:后台任务,优先级最低。
  • Priority.LOW:低优先级任务。
  • Priority.MEDIUM:中等优先级任务。
  • Priority.HIGH:高优先级任务。

任务的添加与执行逻辑

任务添加:

const task = new taskpool.Task(func, args);

任务执行:

await taskpool.execute(task);

任务取消:

taskpool.cancel(task);

示例代码:通过 TaskPool 执行 CPU 密集型任务的示例

以下是一个简单的示例,演示如何使用 TaskPool 执行 CPU 密集型任务:

import { taskpool } from '@kit.ArkTS';
@Concurrent
function complexCalculation(data: ArrayBuffer): ArrayBuffer {
  // 执行复杂的计算操作
  return data;
}
async function concurrentCalculation() {
  const data = new ArrayBuffer(1024);
  const task = new taskpool.Task(complexCalculation, data);
  await taskpool.execute(task);
}
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(async () => {
            await concurrentCalculation();
          })
          .width('100%');
      }
    }
    .height('100%');
  }
}

这段代码定义了一个名为 Index 的组件,并在组件中显示了一条文本消息 “Hello World”。点击按钮会执行 concurrentCalculation 函数,该函数创建一个并发任务并执行它。任务完成后,会在控制台输出结果。

总结

通过以上介绍,您可以了解到鸿蒙系统中的 TaskPool 和 Worker 并发能力的使用方法。TaskPool 和 Worker 都是基于 Actor 并发模型实现的,但它们的使用场景和功能有所不同。希望本文能够帮助您掌握鸿蒙系统中的并发编程技术,并开发出更优秀的鸿蒙应用。

HarmonyOS 应用开发之TaskPool和Worker的对比 (TaskPool和Worker) TaskPool(任务池)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。本文将从 实现特点 和 适用场景 两个方面来进行TaskPool与Worker的比较。 阅读详情

相关推荐

鸿蒙原生APP性能优化之TaskPool和Worker的对比实践

ArkTS提供了TaskPool与Worker两种多线程并发方案,下面我们将从其工作原理、使用效果对比两种方案的差异,进而选择适用于ArkTS图片编辑场景的并发方案。表2TaskPool与Worker并发方案对比对比维度WorkerTaskPool编码效率Worker需要开发者关注线程数量的上限,管理线程生命周期,随着任务的增多也会增加线程管理的复杂度。TaskPool简单易用,开发者很容易上手。数据传输。

2401_87677001的博客 774

Spark提交yarn虚拟内存不足任务失败

19/07/20 18:06:06 INFO yarn.Client: client token: N/A diagnostics: N/A ApplicationMaster host: BG001 ApplicationMaster RPC port: 34351 queue: default ...

anddyhua's Cookbook 6649

鸿蒙第16篇——数据持久化

本文介绍的数据持久化是指鸿蒙应用的数据持久化存储。它是将内存中的数据通过文件或数据库的形式保存到设备存储中。鸿蒙支持多种数据存储方式, 包括用户首选项Preferences、 键值型数据库KV-Store和关系型数据库。

daozhongyang的专栏 88

鸿蒙案例实践:图像处理应用中多线程任务调度与性能优化

至此,我们设计并实现了一个基于 ArkTS 的多线程图像处理应用,展示了如何通过TaskGroup来分片并发处理图像数据,以及如何通过设置任务优先级来优化任务调度。通过性能监控,我们能够分析每个任务的执行时间并找到性能瓶颈,从而进行针对性的优化。这个案例展示了 ArkTS 强大的并发处理能力和性能调优工具,能够帮助开发者在 CPU 密集型任务中有效利用多核 CPU 的计算能力,提升系统的整体性能。

same4869的博客 974

浅谈功放PA的VBW

摘要:VBW(视频带宽)反映功放的宽带非线性特性和记忆效应,影响数字预失真(DPD)校正能力。其成因是功放管寄生参数(如Cshunt和Leff)形成低频并联谐振,导致供电臂阻抗增大,引发电压波动和记忆效应。测试方法包括双音IM3/IM5测试(以两侧IM3差≥3dB定义VBW)和魔T测试(通过S21曲线测量谐振频率)。改善措施主要是减小Leff,如采用双电源平衡馈电。VBW指标要求通常为魔T测试结果大于3倍信号带宽,以确保功放线性度。

weixin_49761275的博客 1572

OnlyOffice Docker部署全攻略:解除连接限制+文件大小限制+中文字体优化

本文详细介绍了OnlyOffice企业级Docker部署的完整解决方案,重点破解连接限制、文件大小限制和中文字体优化三大核心痛点。通过定制化镜像部署、性能调优配置和中文字体深度优化,帮助企业实现高效稳定的文档协作平台。

weixin_28837817的博客 366

HarmonyOS 里的 TaskPool 有多好用?一篇文章带你搞懂多线程神器

HarmonyOS的TaskPool是解决多线程任务管理的神器,它通过线程池自动管理任务分配和资源回收。开发者只需用@Concurrent装饰任务函数,通过taskpool.execute执行,即可实现主线程与工作线程的高效协作。关键点包括:任务函数必须序列化(数据量≤16MB)、耗时不超过3分钟、避免使用UI库和闭包变量,Promise需注意状态传递。TaskPool支持动态线程调整和优先级设置(如IDLE级后台任务),有效提升应用性能。

2401_86731168的博客 1254

从零开始:使用Remix和MetaMask在测试网部署智能合约的完整指南

本文提供了一份完整的指南,教你如何使用Remix和MetaMask在测试网上部署智能合约。从环境搭建、获取测试网代币到编写和部署合约,再到与合约交互和连接Python后端,涵盖了智能合约开发的各个环节。特别适合初学者快速上手区块链开发,同时介绍了安全注意事项和调试技巧。

weixin_29019241的博客 473

鸿蒙5.0&next开发【TaskPool使用规范和常见问题】应用框架开发

[任务池(TaskPool)]基于池化思想和任务机制,提供了一系列并发API,旨在充分发挥多核CPU的优势,降低主线程负载,提高程序性能。使用TaskPool进行开发需遵守一些规范,并综合业务和并发特性,细分场景使用。违反这些规范可能会导致性能劣化,引起稳定性或者其他非预期的问题。

zhenggaoxiao232的博客 1506

【开关电源】开关电源实战经验分享

开关电源原理设计、Layout设计经验分享

weixin_42098658的博客 4167

vscode中创建vue快捷键

1.安装Vetur插件(扩展里面直接搜) 2.vscode 界面里面左上角选则 文件=> 首选项=> 用户代码片段=>新建全局代码片段=>在输入框中新建名称为vue.json 3.删除里面的注释,当然你也可以留着,把下面的代码粘贴进去! { // Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // descri

Leon_940002463的博客 3207

鸿蒙next开发:多线程并发-TaskPool

TaskPool为应用程序提供多线程环境,降低资源消耗、提高系统性能,无需管理线程生命周期。

qq_39652397的博客 1089

[NoC]Outstanding和Credit的概念详解

摘要:本文详细解析了计算机体系结构中outstanding和credit两个核心概念。outstanding指已发出但未完成的请求数量,通过跟踪未决事务实现并发和乱序执行,常见于AXI总线等场景;credit则是基于信用令牌的流控机制,通过控制发送速率防止接收端缓冲溢出,多用于NoC网络。二者在目的、机制上存在差异:outstanding侧重提升并发度,credit关注流控保护。文章通过AXI协议实例和SystemC代码示例展示了二者的应用与结合方式,并探讨了在SoC设计中参数优化的方法,包括性能/资源权衡

元直的博客 2281

任务池-TaskPool

fill:#333;stroke:1;fill:none;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;important;调度任务你的任务执行器接口YourTask你的任务数据TaskBase任务基类你的任务执行器。

qmladm的博客 556

cesium 淹没分析

cesium淹没分析

God's asylum的博客 480

微信小程序开发:实现地图导航功能

其中,id用于调用地图组件,latitude和longitude表示地图的中心点坐标,markers表示地图中的标记点,covers表示地图中的覆盖物,polyline表示地图中的折线图,show-location表示是否显示当前定位点,bindregionchange表示移动地图时触发的事件。其中,id表示标记点的唯一标识,latitude和longitude表示标记点的坐标,title表示标记点的名称,iconPath表示标记点的图标路径,width和height表示标记点的宽度和高度。

吃不胖. 8917

【HarmonyOS Next】鸿蒙TaskPool和Worker详解 (一)

【内存共享并发模型指多线程同时执行任务,这些线程依赖同一内存并且都有权限访问,线程访问内存前需要抢占并锁定内存的使用权,没有抢占到内存的线程需要等待其他线程释放使用权再执行。从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。现在Worker同个进程下,最多支持同时开启64个Worker线程,实际数量由进程内存决定。互相之间不打扰,内存不共享,通过消息进行传递,线程间进行通信传输。在鸿蒙中通过TaskPool和Worker实现多线程并发,两者都基于Actor并发模型实现。

路漫漫亦无涯 1645

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Harmonyos之TaskPool浅学

在开发过程中,多线程是我们非常常见的一种技术。当前ArkTS提供了TaskPool和Worker两种并发能力,下面 我们来探索下TaskPool的使用方式。多线程并发TaskPool任务启动迟。

yong_19930826的博客 949

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

通过netty解析future

netty中的future继承自jdk中cocurrent包下future的接口。 Future的V可以是void,不一定是有返回值的,所以通过返回值来判断task isDone()是错误的。所以isDone的判断不应该通过返回值来做。只有isDone了之后,才去做get操作。所以...

chuangyu5704的博客 1006

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HarmonyOS 7 端侧 AI 图像超分的工程化落地

用户抱怨网络差的时候图片传不上去,更严重的是,大量的私密照片上传到云端,引发了严重的隐私合规审查危机。痛定思痛后,我们决定把 AI 模型直接塞进手机里,用端侧的 NPU 来做推理,但这绝非易事。我们首先在服务端对模型进行了知识蒸馏,把参数砍掉了一大半,然后利用 MindSpore Lite 的转换工具,将模型转成了鸿蒙底层支持的。即便如此,模型依然有 20 多兆,我们最终选择了 FP16 量化,牺牲了极其微小的画质,换取了内存占用减半。推理过程极其消耗 CPU 和内存,稍微大一点的图,处理时间长达几秒。

2602_97267507的博客 158

〖物流终端实战 05〗纯血鸿蒙 ArkTS 高阶性能优化:长列表渲染、组件复用与内存泄漏排查

本文深度剖析鸿蒙ArkTS高阶性能优化,直击长列表卡顿与内存泄漏痛点。针对渲染,指出ForEach全量构建的缺陷,强调采用LazyForEach(V2推荐Repeat)配合增量通知及稳定业务Key;针对组件复用,明确@Reusable仅复用实例不重置状态,必须在aboutToReuse中手动清理UI状态;针对内存泄漏,总结全局监听未注销、定时器未清理及长生命周期对象持有页面引用三大元凶,并指导通过DevEco Profiler的Heap快照排查引用链。文章强调优化需遵循“先定位后改代码”原则,助力开发者打造

Eyf • 半字节的博客 635

AppGallery 上架自检 SOP:签名、隐私对齐与包体校验实战【鸿蒙心迹】

上架被驳回多因签名、隐私声明与包体不一致。本文提炼“签名→隐私对齐→包体校验”自检SOP,配套一键脚本与权限三角校验代码,实现90%驳回前置拦截。通过CI强制release签名、代码/声明/功能三者权限对齐、包体完整性校验,确保提审一次过。实战清单可直接抄,让过审从运气变为流程。

wdracky的专栏 311

【鸿蒙专题与实战】测试体系:单元测试、组件测试与 UI 测试

本文系统讲解鸿蒙开发中的三层测试实践:底层单元测试(用Hypium框架,优先覆盖纯函数、边界与异常)、中层ViewModel逻辑、顶层仅测3-5条关键UI路径。强调测试应“越往下写得越多”,因单元测试快且成本低,而UI测试慢易出错。通过实例说明断言拆分提升定位效率,结合覆盖率报告(hvigorwtest --coverage)发现盲区,核心是“用覆盖率找漏测,而非追求数字”。附五步落地清单:建测试文件、按优先级补用例、精简UI测试、生成报告、定位未覆盖行。下一篇将开启实战项目:从需求到上架全流程。

信息安全领域优质创作者|操作系统领域专家 164

窗口销毁了监听还在,HarmonyOS 7 生命周期释放的归属分界

综上所述,onWindowStageWillDestroy 是窗口监听的最后安全出口,onWindowStageDestroy 只负责断开窗口引用,onDestroy 管 Ability 级资源——三者不是“程度不同的退出回调”,而是各自有明确的归属范围。窗口监听的所有者是 WindowStage,定时器的所有者是 UIAbility,播放器的所有者是页面或 Ability(取决于你在哪一层创建的),ApplicationContext 监听的所有者是 Ability 的 context。

qq_61905492的博客 198

React Native for OpenHarmony 实战:react-native-file-logger 日志库鸿蒙化适配

本文记录了将 react-native-file-logger 适配至 OpenHarmony 的实战过程。基于鸿蒙 7.0 模拟器,通过 5 个 TurboModule 方法实现日志落盘、轮转、列举与删除,采用 fileIo 实现核心功能,支持按大小和跨天轮转,归档文件命名精确至毫秒。邮件发送功能因平台限制按能力边界处理,明确拒绝并提示用户手动导出。验证通过,日志文件结构清晰,内容完整,产出 HAP 示例与独立 HAR 库,中英双语文档齐全,为鸿蒙应用日志管理提供可靠方案。

m0_62930060的博客 235
上一篇: 鸿蒙编程江湖:异步编程的优势及 Promise的应用
下一篇: 鸿蒙编程江湖:ArkTS中Sendable数据在并发实例间的传递
SameX-4869
博客等级 码龄17年 3354粉丝 657原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值