写点什么

【HarmonyOS Next】鸿蒙应用进程和线程详解

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

    阅读完需:约 8 分钟

【HarmonyOS Next】鸿蒙应用进程和线程详解

【HarmonyOS Next】鸿蒙应用进程和线程详解

一、前言


  1. 进程的定义:进程是系统进行资源分配的基本单位,是操作系统结构的基础。

  2. 在鸿蒙系统中,一个应用下会有三类进程:(1) 主进程,(2) ExtensionAbility 进程,同一种类型的 ExtensionAbility 会放在一个进程里。例如 FromExtensionAbility,创建了两个,也会在同一个进程里。【ExtensionAbility 详情参见官方链接:ExtensionAbility组件】(3) WebView 渲染进程,用于网页容器渲染的进程。【这种设计提升了鸿蒙系统中 arkWeb 的网页容器渲染能力】

  3. 线程的定义:线程是操作系统进行运算调度的基本单位,是进程中的执行流,共享进程的资源。

  4. 鸿蒙系统中,以主进程举例,会有三种类型的线程:(1)主线程(2)TaskPool Worker 线程(3)Worker 线程后两者用于创建多线程,TaskPool Worker 主要用于处理轻量级的耗时任务。Worker 用于偏重的耗时任务。

二、进程处理:


  1. 进程的创建:如上图所示,三方应用可以创建 XXExtensionAbility 的形式,增加应用内的进程。但是 Webview 渲染进程和主进程的是不能创建增加。

  2. 跨进程通信:鸿蒙系统目前提供了两种方式实现跨进程通信,公共事件和 Emitter。这两个方案外,startAbility 也可传递一些信息。


公共事件主要是监听系统的事件,分为系统公共事件和自定义事件。三方应用主要通过自定义事件来通信。


import { commonEventManager } from '@kit.BasicServicesKit';import { BusinessError } from '@kit.BasicServicesKit';
// 定义订阅者,用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作let subscriber: commonEventManager.CommonEventSubscriber;// 订阅者信息let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = { events: ["event"]};// 创建订阅者回调function createCB(err: BusinessError, commonEventSubscriber: commonEventManager.CommonEventSubscriber) { if (err != null) { console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`); } else { console.info(`Succeeded in creating subscriber`); subscriber = commonEventSubscriber; }}// 创建订阅者commonEventManager.createSubscriber(subscribeInfo, createCB);
复制代码


Emitter 的使用类似于 EventHub,只不过在这个基础上,多了传递包裹的封装,添加了优先级和序号。也新增了 once,监听一次的接口而已。


@Sendableclass Sample {    constructor() {        this.count = 100;    }    printCount() {        console.info('Print count : ' + this.count);    }    count: number;}
let callback = (eventData: emitter.GenericEventData<Sample>): void => { let storage: Sample = eventData.data!; storage.printCount();}// 收到eventId为"eventId"的事件后执行回调函数emitter.on("eventId", callback);
复制代码

三、线程处理:


1.线程的创建和线程间通信:如上所说,可以使用 TaskPool Worker 和 Worker 创建线程。并且配套会有双向通信的接口。需要注意的是前者有性能要求,太过于耗时的操作,例如超过三分钟,就会无条件失败,这种耗时任务就要使用后者 Worker 来实现。不过后者又因为消耗系统资源,一个应用只能创建八个。


TaskPool Worker:


@Concurrentfunction printArgs(args: number): number {    console.info("printArgs: " + args);    return args;}
taskpool.execute(printArgs, 100).then((value: Object) => { // 100: test number console.info("taskpool result: " + value);});
复制代码


Worker:


// Worker.etsimport { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
// 创建worker线程中与宿主线程通信的对象const workerPort = worker.workerPort
// worker线程接收宿主线程信息workerPort.onmessage = (e: MessageEvents): void => { // data:宿主线程发送的信息 let data: number = e.data; // 往收到的buffer里写入数据 const view = new Int8Array(data).fill(3); // worker线程向宿主线程发送信息 workerPort.postMessage(view);}
// worker线程发生error的回调workerPort.onerror = (err: ErrorEvent) => { console.log("worker.ets onerror" + err.message);}
// Index.etsimport { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
@Entry@Componentstruct Index { @State message: string = 'Hello World';
build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { // 宿主线程中创建Worker对象 const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets"); // 宿主线程向worker线程传递信息 const buffer = new ArrayBuffer(8); workerInstance.postMessage(buffer, [buffer]); // 宿主线程接收worker线程信息 workerInstance.onmessage = (e: MessageEvents): void => { // data:worker线程发送的信息 let data: number = e.data; console.info("main thread data is " + data); // 销毁Worker对象 workerInstance.terminate(); } // 在调用terminate后,执行onexit workerInstance.onexit = (code) => { console.log("main thread terminate"); }
workerInstance.onerror = (err: ErrorEvent) => { console.log("main error message " + err.message); } }) } .width('100%') .height('100%') } }}
复制代码


2.线程内通信:EventHub,GlobalThis,单例,AppStorage。都可实现线程内 UI 界面,UIAbility 和业务类之间的通信。

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

GeorgeGcs

关注

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

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

评论

发布
暂无评论
【HarmonyOS Next】鸿蒙应用进程和线程详解_鸿蒙_GeorgeGcs_InfoQ写作社区