哪网站建设,网页制作免费教程,常州百度推广代理,qq网站空间赞【HarmonyOS Next】鸿蒙TaskPool和Worker详解 #xff08;一#xff09;
一、TaskPool和Worker如何实现多线程#xff1f;各自特点是什么#xff1f;
在鸿蒙中通过TaskPool和Worker实现多线程并发#xff0c;两者都基于Actor并发模型实现。 Actor并发模型#xff0c;每…【HarmonyOS Next】鸿蒙TaskPool和Worker详解 一
一、TaskPool和Worker如何实现多线程各自特点是什么
在鸿蒙中通过TaskPool和Worker实现多线程并发两者都基于Actor并发模型实现。 Actor并发模型每一个独立的Actor代表一个线程。互相之间不打扰内存不共享通过消息进行传递线程间进行通信传输。
比内存共享并发模型好在不会同时竞争同一内存资源。
【内存共享并发模型指多线程同时执行任务这些线程依赖同一内存并且都有权限访问线程访问内存前需要抢占并锁定内存的使用权没有抢占到内存的线程需要等待其他线程释放使用权再执行。】
两者都是为了处理耗时或者密集型的任务。用多线程的方式规避堵塞主线程的问题。从而最大化系统的利用率降低整体资源消耗并提高系统的整体性能。
生命周期 TaskPool自行管理生命周期无需关心任务负载高低。而Worker需要自行管理Worker的数量及生命周期。
个数上限 现在Worker同个进程下最多支持同时开启64个Worker线程实际数量由进程内存决定。而TaskPool线程池的概念理论上没有上限。
任务处理量级 TaskPool主要处理轻量级所以有三分钟的任务处理时间限制。worker主要处理时间更长偏重。
二、TaskPool的使用
首先定义处理函数
import { taskpool } from kit.ArkTS;Concurrent
async function concurrentTest(context: common.UIAbilityContext): Promiseboolean {
// 处理耗时任务return true;
}通过调用execute()方法执行任务 taskpool.execute(concurrentTest, context).then(() {// 调度结果处理})三、worker的使用
1.首先需要创建worker文件 在其中进行消息收发和耗时逻辑处理。
2.之后进行worker实例的获取
// Index.ets
import { worker } from kit.ArkTS;const workerInstance: worker.ThreadWorker new worker.ThreadWorker(entry/ets/workers/MyWorker.ts);3.进行消息监听和发送
// Index.ets
let 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 });