写点什么

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

作者:GeorgeGcs
  • 2025-03-24
    上海
  • 本文字数:995 字

    阅读完需:约 3 分钟

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

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

一、TaskPool 和 Worker 如何实现多线程?各自特点是什么?

在鸿蒙中通过 TaskPool 和 Worker 实现多线程并发,两者都基于 Actor 并发模型实现。



Actor 并发模型,每一个独立的 Actor 代表一个线程。互相之间不打扰,内存不共享,通过消息进行传递,线程间进行通信传输。


比内存共享并发模型好在不会同时竞争同一内存资源。


【内存共享并发模型指多线程同时执行任务,这些线程依赖同一内存并且都有权限访问,线程访问内存前需要抢占并锁定内存的使用权,没有抢占到内存的线程需要等待其他线程释放使用权再执行。】


两者都是为了处理耗时或者密集型的任务。用多线程的方式,规避堵塞主线程的问题。从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。


生命周期 TaskPool 自行管理生命周期,无需关心任务负载高低。而 Worker 需要自行管理 Worker 的数量及生命周期。


个数上限现在 Worker 同个进程下,最多支持同时开启 64 个 Worker 线程,实际数量由进程内存决定。而 TaskPool 线程池的概念,理论上没有上限。


任务处理量级 TaskPool 主要处理轻量级,所以有三分钟的任务处理时间限制。worker 主要处理时间更长,偏重。

二、TaskPool 的使用

  1. 首先定义处理函数:


import { taskpool } from '@kit.ArkTS';
@Concurrentasync function concurrentTest(context: common.UIAbilityContext): Promise<boolean> {// 处理耗时任务 return true;}
复制代码


  1. 通过调用 execute()方法执行任务


              taskpool.execute(concurrentTest, context).then(() => {              // 调度结果处理                      })
复制代码

三、worker 的使用

1.首先需要创建 worker 文件:



在其中进行消息收发和耗时逻辑处理。


2.之后进行 worker 实例的获取:


// Index.etsimport { worker } from '@kit.ArkTS';
const workerInstance: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
复制代码


3.进行消息监听和发送:


// Index.etslet done = false;
// 接收Worker子线程的结果workerInstance.onmessage = (() => { console.info('MyWorker.ts onmessage'); if (!done) { workerInstance.postMessage({ 'type': 1, 'value': 0 }); done = true; }})
workerInstance.onerror = (() => { // 接收Worker子线程的错误信息})
// 向Worker子线程发送训练消息workerInstance.postMessage({ 'type': 0 });
复制代码


发布于: 刚刚阅读数: 4
用户头像

GeorgeGcs

关注

路漫漫其修远兮,吾将上下而求索。 2024-12-24 加入

历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 OpenHarmony,HarmonyOS,Flutter,H5,Android,IOS。 目前任职鸿蒙应用架构师。 HarmonyOS官方认证创作先锋

评论

发布
暂无评论
【HarmonyOS Next】鸿蒙TaskPool和Worker详解 (一)_Worker_GeorgeGcs_InfoQ写作社区