在鸿蒙中通过TaskPool和Worker实现多线程并发,两者都基于Actor并发模型实现。
Actor并发模型,每一个独立的Actor代表一个线程。互相之间不打扰,内存不共享,通过消息进行传递,线程间进行通信传输。
比内存共享并发模型好在不会同时竞争同一内存资源。
【内存共享并发模型指多线程同时执行任务,这些线程依赖同一内存并且都有权限访问,线程访问内存前需要抢占并锁定内存的使用权,没有抢占到内存的线程需要等待其他线程释放使用权再执行。】
两者都是为了处理耗时或者密集型的任务。用多线程的方式,规避堵塞主线程的问题。从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。
生命周期
TaskPool自行管理生命周期,无需关心任务负载高低。而Worker需要自行管理Worker的数量及生命周期。
个数上限
现在Worker同个进程下,最多支持同时开启64个Worker线程,实际数量由进程内存决定。而TaskPool线程池的概念,理论上没有上限。
任务处理量级
TaskPool主要处理轻量级,所以有三分钟的任务处理时间限制。worker主要处理时间更长,偏重。
import { taskpool } from '@kit.ArkTS';
@Concurrent
async function concurrentTest(context: common.UIAbilityContext): Promise<boolean> {
// 处理耗时任务
return true;
}
taskpool.execute(concurrentTest, context).then(() => {
// 调度结果处理
})
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 });
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。