【HarmonyOS Next】鴻蒙應用進程和線程詳解

【HarmonyOS Next】鴻蒙應用進程和線程詳解

一、前言

進程

  1. 進程的定義:
    進程是系統進行資源分配的基本單位,是操作系統結構的基礎。

    在鴻蒙系統中,一個應用下會有三類進程
    (1) 主進程
    (2) ExtensionAbility進程,同一種類型的ExtensionAbility會放在一個進程里。例如FromExtensionAbility,創建了兩個,也會在同一個進程里。【ExtensionAbility詳情參見官方鏈接:ExtensionAbility組件】
    (3) WebView渲染進程,用于網頁容器渲染的進程。【這種設計提升了鴻蒙系統中arkWeb的網頁容器渲染能力】

  2. 線程的定義:
    線程是操作系統進行運算調度的基本單位,是進程中的執行流,共享進程的資源。

    鴻蒙系統中,以主進程舉例,會有三種類型的線程:
    (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,監聽一次的接口而已。


class 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:


function printArgs(args: number): number {console.info("printArgs: " + args);return args;
}taskpool.execute(printArgs, 100).then((value: Object) => { // 100: test numberconsole.info("taskpool result: " + value);
});

Worker:

// Worker.ets
import { 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.ets
import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';

struct Index { 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后,執行onexitworkerInstance.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和業務類之間的通信。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895902.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895902.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

迪威模型網:免費暢享 3D 打印盛宴,科技魅力與趣味創意并存

還在為尋找優質3D打印模型而發愁&#xff1f;快來迪威模型網&#xff08;https://www.3dwhere.com/&#xff09;&#xff0c;一個集前沿科技與無限趣味于一體的免費3D打印寶藏平臺&#xff01; 踏入迪威模型網&#xff0c;仿佛開啟一場未來科技之旅。其“3D打印”專區&#xff…

力扣LeetCode: 1287 有序數組中出現次數超過25%的元素

題目&#xff1a; 給你一個非遞減的 有序 整數數組&#xff0c;已知這個數組中恰好有一個整數&#xff0c;它的出現次數超過數組元素總數的 25%。 請你找到并返回這個整數 示例&#xff1a; 輸入&#xff1a;arr [1,2,2,6,6,6,6,7,10] 輸出&#xff1a;6提示&#xff1a; …

一文看常見的消息隊列對比

一、核心特性對比表 維度KafkaRabbitMQRocketMQPulsar架構設計分布式日志系統&#xff0c;依賴ZooKeeper基于AMQP協議的代理模型主從架構NameServer協調分層架構&#xff08;BrokerBookKeeper&#xff09;單機吞吐量100萬 TPS5萬 TPS50萬 TPS150萬 TPS消息延遲毫秒級&#xff…

Ubuntu USB耳機找不到設備解決

? 一. 確定硬件連接 lsusb -t 插拔USB耳機&#xff0c;確定是否有USB識別到 二. 查看輸出設備 sudo apt-get install pavucontrol pavucontrol 點擊想要使用的輸出設備后面的綠色選項 三. 輸出設備沒有USB耳機時調試 3.1 確認ALSA是否識別設備 列出ALSA播放設備&#…

[筆記.AI]如何判斷模型是否通過剪枝、量化、蒸餾生成?

以下摘自與DeepSeek-R1在線聯網版的對話 一、基礎判斷維度 技術類型核心特征驗證方法剪枝模型參數減少、結構稀疏化1. 檢查模型參數量是否顯著小于同類標準模型1 2. 分析權重矩陣稀疏性&#xff08;如非零參數占比<30%&#xff09;4量化權重/激活值精度降低、推理速度提升1…

Redis如何解決熱Key問題

目錄 **如何解決 Redis 的熱 Key&#xff08;Hot Key&#xff09;問題&#xff1f;****解決方案** **1. 使用多級緩存****方案** **2. 進行 Key 預分片&#xff08;Key Sharding&#xff09;****方案** **3. 使用 Redis 復制機制&#xff08;主從復制或集群&#xff09;****方案…

云計算架構學習之Ansible-playbook實戰、Ansible-流程控制、Ansible-字典循環-roles角色

一、Ansible-playbook實戰 1.Ansible-playbook安裝軟件 bash #編寫yml [rootansible ansible]# cat wget.yml - hosts: backup tasks: - name: Install wget yum: name: wget state: present #檢查playbook的語法 [rootansible ansible]…

【Web前端開發精品課 HTML CSS JavaScript基礎教程】第二十四章課后題答案

文章目錄 問題1&#xff1a;問題2&#xff1a;問題3&#xff1a; 問題1&#xff1a; 在HTML中嵌入JavaScript&#xff0c;應該使用的標簽是&#xff08; &#xff09;。 選項&#xff1a; A. <style></style> B. <script></script> C. <js><…

用python進行二分法查找(python實例三十)

目錄 1.認識Python 2.環境與工具 2.1 python環境 2.2 Visual Studio Code編譯 3.代碼示例 4.運行結果 1.認識Python Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。 Python 的設計具有很強的可讀性&#xff0c;相比其他語言經常使用英文關鍵…

Qt學習(五)自定義對話框,多窗口開發---添加設計師類, MDI多窗口開發

一 對話框 實現功能&#xff1a;打開文件&#xff0c;選擇目錄&#xff0c;保存文件&#xff0c;選擇顏色&#xff0c;選擇字體&#xff0c;輸入信息&#xff0c; 消息提示框 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE na…

用 Python 實現簡易的 Web 爬蟲:從入門到實戰

一、引言 在信息爆炸的時代,網絡上蘊含著海量的數據。如果我們想要獲取特定的信息,手動從網頁上復制粘貼顯然效率極低。這時,Web 爬蟲就派上了用場。Web 爬蟲是一種自動獲取網頁內容的程序,它可以模擬人類在瀏覽器中的操作,快速地抓取網頁上的數據。本文將帶領大家使用 Py…

機器視覺檢測中,2D面陣相機和線掃相機的區別

2D面陣相機和線掃相機是工業視覺系統中常用的兩種相機類型&#xff0c;各有其特點和應用場景。 2D面陣相機 特點&#xff1a; 成像方式&#xff1a;通過二維傳感器一次性捕捉整個場景的圖像。 分辨率&#xff1a;分辨率由傳感器的像素數決定&#xff0c;常見的有百萬像素到幾千…

ECharts極簡入門

ECharts 是一個基于 JavaScript的開源可視化圖表庫&#xff0c;廣泛應用于數據可視化的場景中&#xff0c;支持多種圖表類型&#xff0c;如柱狀圖、折線圖、餅圖、散點圖、雷達圖等&#xff0c;且具有強大的自定義功能。 1. ECharts 基本使用 首先需要引入 ECharts 庫&#xf…

go設置鏡像代理

前言 在 Go 開發中&#xff0c;如果直接從官方源&#xff08;https://proxy.golang.org&#xff09;下載依賴包速度較慢&#xff0c;可以通過設置 鏡像代理 來加速依賴包的下載。以下是增加 Go 鏡像代理的詳細方法&#xff1a; 一、設置 Go 鏡像代理 1. 使用環境變量設置代理…

Linux部署DeepSeek r1 模型訓練

之前寫過一篇windows下部署deepseekR1的文章&#xff0c;有小伙伴反饋提供一篇linux下部署DeepSeek r1 模型訓練教程&#xff0c;在 Linux 環境下&#xff0c;我找了足夠的相關資料&#xff0c;花費了一些時間&#xff0c;我成功部署了 DeepSeek R1 模型訓練任務&#xff0c;結…

AI Agent架構深度解析:從ReAct到AutoGPT,自主智能體的技術演進與工程實踐

前言 覺得不錯就點個贊吧&#xff01;。 一、AI Agent技術架構演進圖譜 &#xff08;配圖&#xff1a;AI Agent架構演進時間軸&#xff0c;標注關鍵技術節點&#xff09; 1.1 三代架構對比分析 架構類型代表系統核心特征局限性反應式DeepBlue預置規則庫無長期記憶認知式Wats…

嵌入式經常用到串口,如何判斷串口數據接收完成?

說起通信&#xff0c;首先想到的肯定是串口&#xff0c;日常中232和485的使用比比皆是&#xff0c;數據的發送、接收是串口通信最基礎的內容。這篇文章主要討論串口接收數據的斷幀操作。 空閑中斷斷幀 一些mcu&#xff08;如&#xff1a;stm32f103&#xff09;在出廠時就已經在…

HTML/CSS中并集選擇器

1.作用:選中多個選擇器對應的元素,又稱:分組選擇器 所謂并集就是或者的含義. 2.語法:選擇器1,選擇器2,選擇器3,......選擇器n 多個選擇器通過,連接,此處,的含義就是:或. .rich,.beauty{color: blue;} 3.注意事項 1.并集選擇器,我們一般豎著寫 2.任何形式的選擇器,都可以作為并…

解鎖機器學習核心算法 | 隨機森林算法:機器學習的超強武器

一、引言 在機器學習的廣闊領域中&#xff0c;算法的選擇猶如為一場冒險挑選趁手的武器&#xff0c;至關重要。面對海量的數據和復雜的任務&#xff0c;合適的算法能夠化繁為簡&#xff0c;精準地挖掘出數據背后隱藏的模式與價值。機器學習領域有十大核心算法&#xff0c;而隨…

Shapr3D在ipad上無法識別鼠標點擊問題

此問題我去過長沙Apple官方直營店咨詢過此問題&#xff0c;官方直營店也不知道解決方案&#xff0c;遂在此提醒長沙Apple官方線下直營店的所有店員。 問題描述 1.不知道為什么在買了Magic Keyboard后還是無法識別單擊觸控板&#xff0c;遂為了解決這個問題我特意從江西跑到長沙…