女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙開發:線程模型

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-06-24 17:27 ? 次閱讀

線程模型

FA模型下的線程主要有如下三類:

  • 主線程: 負責管理其他線程。
  • Ability線程:
    • 每個Ability一個線程。
    • 輸入事件分發。
    • UI繪制。
    • 應用代碼回調(事件處理,生命周期)。
    • 接收Worker發送的消息。
  • Worker線程: 執行耗時操作。

基于當前的線程模型,不同的業務功能運行在不同的線程上,業務功能的交互就需要線程間通信。線程間通信目前主要有[Emitter]
開發前請熟悉鴻蒙開發指導文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

使用Emitter進行線程間通信

[Emitter]主要提供線程間發送和處理事件的能力,包括對持續訂閱事件或單次訂閱事件的處理、取消訂閱事件、發送事件到事件隊列等。

Emitter的開發步驟如下:

  1. 訂閱事件

    import emitter from '@ohos.events.emitter';
    import promptAction from '@ohos.promptAction';
    import hilog from '@ohos.hilog';
    
    const TAG: string = 'ThreadModel';
    const DOMAIN_NUMBER: number = 0xFF00;
    
    // 定義一個eventId為1的事件
    let event: emitter.InnerEvent = {
      eventId: 1
    };
    
    // 收到eventId為1的事件后執行該回調
    let callback = (eventData: emitter.EventData): void = > {
      promptAction.showToast({
        message: JSON.stringify(eventData)
      });
      hilog.info(DOMAIN_NUMBER, TAG, 'event callback:' + JSON.stringify(eventData));
    };
    
    // 訂閱eventId為1的事件
    emitter.on(event, callback);
    promptAction.showToast({
      message: $r('app.string.emitter_subscribe_success_toast')
    });
    
  2. 發送事件

    import emitter from '@ohos.events.emitter';
    
    // 定義一個eventId為1的事件,事件優先級為Low
    let event: emitter.InnerEvent = {
      eventId: 1,
      priority: emitter.EventPriority.LOW
    };
    
    let eventData: emitter.EventData = {
      data: {
        content: 'c',
        id: 1,
        isEmpty: false
      }
    };
    
    // 發送eventId為1的事件,事件內容為eventData
    emitter.emit(event, eventData);
    

[Worker]兩種方式,其中Emitter主要適用于線程間的事件同步, Worker主要用于新開一個線程執行耗時任務。

Worker簡介

Worker主要作用是為應用程序提供一個多線程的運行環境,可滿足應用程序在執行過程中與主線程分離,在后臺線程中運行一個腳本操作耗時操作,極大避免類似于計算密集型或高延遲的任務阻塞主線程的運行。具體接口信息及使用方法詳情請見[Worker]。

Worker運作機制

圖1 Worker運作機制示意圖

worker

創建Worker的線程稱為宿主線程(不一定是主線程,工作線程也支持創建Worker子線程),Worker自身的線程稱為Worker子線程(或Actor線程、工作線程)。每個Worker子線程與宿主線程擁有獨立的實例,包含基礎設施、對象、代碼段等。Worker子線程和宿主線程之間的通信是基于消息傳遞的,Worker通過序列化機制與宿主線程之間相互通信,完成命令及數據交互。

Worker注意事項

  • 創建Worker時,有手動和自動兩種創建方式,手動創建Worker線程目錄及文件時,還需同步進行相關配置,詳情請參考[創建Worker的注意事項]。
  • 使用Worker能力時,構造函數中傳入的Worker線程文件的路徑在不同版本有不同的規則,詳情請參見[文件路徑注意事項]。
  • Worker創建后需要手動管理生命周期,且最多同時運行的Worker子線程數量為64個,詳情請參見[生命周期注意事項]。
  • 由于不同線程中上下文對象是不同的,因此Worker線程只能使用線程安全的庫,例如UI相關的非線程安全庫不能使用,具體請見[多線程安全注意事項]。
  • 序列化傳輸的數據量大小限制為16MB。
  • 使用Worker模塊時,需要在主線程中注冊onerror接口,否則當worker線程出現異常時會發生jscrash問題。
  • 不支持跨HAP使用Worker線程文件。

創建Worker的注意事項

Worker線程文件需要放在"{moduleName}/src/main/ets/"目錄層級之下,否則不會被打包到應用中。有手動和自動兩種創建Worker線程目錄及文件的方式。

  • 手動創建:開發者手動創建相關目錄及文件,此時需要配置build-profile.json5的相關字段信息,Worker線程文件才能確保被打包到應用中。
    Stage模型:

    "buildOption": {
      "sourceOption": {
        "workers": [
          "./src/main/ets/workers/worker.ets"
        ]
      }
    }
    

    FA模型:

    "buildOption": {
      "sourceOption": {
        "workers": [
          "./src/main/ets/MainAbility/workers/worker.ets"
        ]
      }
    }
    
  • 自動創建:DevEco Studio支持一鍵生成Worker,在對應的{moduleName}目錄下任意位置, 點擊鼠標右鍵 > New > Worker ,即可自動生成Worker的模板文件及配置信息,無需再手動在build-profile.json5中進行相關配置。

文件路徑注意事項

當使用Worker模塊具體功能時,均需先構造Worker實例對象,其構造函數與API版本相關,且構造函數需要傳入Worker線程文件的路徑(scriptURL)。

// 導入模塊
import { worker } from '@kit.ArkTS';

// API 9及之后版本使用:
const worker1: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ets');
// API 8及之前版本使用:
const worker2: worker.Worker = new worker.Worker('entry/ets/workers/MyWorker.ets');

Stage模型下的文件路徑規則

構造函數中的scriptURL要求如下:

  • scriptURL的組成包含 {moduleName}/ets 和相對路徑 relativePath。
  • relativePath是Worker線程文件和"{moduleName}/src/main/ets/"目錄的相對路徑。

1) 加載Ability中Worker線程文件場景

加載Ability中的worker線程文件,加載路徑規則:{moduleName}/ets/{relativePath}。

import { worker } from '@kit.ArkTS';

// worker線程文件所在路徑:"entry/src/main/ets/workers/worker.ets"
const workerStage1: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/worker.ets');

// worker線程文件所在路徑:"phone/src/main/ets/ThreadFile/workers/worker.ets"
const workerStage2: worker.ThreadWorker = new worker.ThreadWorker('phone/ets/ThreadFile/workers/worker.ets');

2) 加載Library-[HSP]中Worker線程文件場景

加載HSP中worker線程文件,加載路徑規則:{moduleName}/ets/{relativePath}。

import { worker } from '@kit.ArkTS';

// worker線程文件所在路徑: "hsp/src/main/ets/workers/worker.ets"
const workerStage3: worker.ThreadWorker = new worker.ThreadWorker('hsp/ets/workers/worker.ets');

3) 加載Library-[HAR]中Worker線程文件場景

加載HAR中worker線程文件存在以下兩種情況:

  • @標識路徑加載形式:所有種類的模塊加載本地HAR中的Worker線程文件,加載路徑規則:@{moduleName}/ets/{relativePath}。
  • 相對路徑加載形式:本地HAR加載該包內的Worker線程文件,加載路徑規則:創建Worker對象所在文件與Worker線程文件的相對路徑。

需要注意的是:如果HAR包會被打包成三方包使用,則HAR包中使用Worker僅支持通過相對路徑加載形式創建。

import { worker } from '@kit.ArkTS';

// @標識路徑加載形式:
// worker線程文件所在路徑: "har/src/main/ets/workers/worker.ets"
const workerStage4: worker.ThreadWorker = new worker.ThreadWorker('@har/ets/workers/worker.ets');

// 相對路徑加載形式:
// worker線程文件所在路徑: "har/src/main/ets/workers/worker.ets"
// 創建Worker對象的文件所在路徑:"har/src/main/ets/components/mainpage/MainPage.ets"
const workerStage5: worker.ThreadWorker = new worker.ThreadWorker('../../workers/worker.ets');

FA模型下的文件路徑規則

構造函數中的scriptURL為:Worker線程文件與"{moduleName}/src/main/ets/MainAbility"的相對路徑。

import { worker } from '@kit.ArkTS';

// 主要說明以下三種場景:

// 場景1: Worker線程文件所在路徑:"{moduleName}/src/main/ets/MainAbility/workers/worker.ets"
const workerFA1: worker.ThreadWorker = new worker.ThreadWorker("workers/worker.ets", {name:"first worker in FA model"});

// 場景2: Worker線程文件所在路徑:"{moduleName}/src/main/ets/workers/worker.ets"
const workerFA2: worker.ThreadWorker = new worker.ThreadWorker("../workers/worker.ets");

// 場景3: Worker線程文件所在路徑:"{moduleName}/src/main/ets/MainAbility/ThreadFile/workers/worker.ets"
const workerFA3: worker.ThreadWorker = new worker.ThreadWorker("ThreadFile/workers/worker.ets");

HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿

鴻蒙文檔.png

生命周期注意事項

  • Worker的創建和銷毀耗費性能,建議開發者合理管理已創建的Worker并重復使用。Worker空閑時也會一直運行,因此當不需要Worker時,可以調用[terminate()]接口或[parentPort.close()]方法主動銷毀Worker。若Worker處于已銷毀或正在銷毀等非運行狀態時,調用其功能接口,會拋出相應的錯誤。
  • Worker的數量由內存管理策略決定,設定的內存閾值為1.5GB和設備物理內存的60%中的較小者。在內存允許的情況下,系統最多可以同時運行64個Worker。如果嘗試創建的Worker數量超出這一上限,系統將拋出錯誤:“Worker initialization failure, the number of workers exceeds the maximum.”。實際運行的Worker數量會根據當前內存使用情況動態調整。一旦所有Worker和主線程的累積內存占用超過了設定的閾值,系統將觸發內存溢出(OOM)錯誤,導致應用程序崩潰。

說明: FA模型每個Ability都有一個獨立的線程,Emiter可用于Ability線程內、Ability線程間、Ability線程與Worker線程的事件同步。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    59

    文章

    2531

    瀏覽量

    43788
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    鴻蒙內核源碼Task/線程技術分析

    前言 在鴻蒙內核中,廣義上可理解為一個Task就是一個線程 一、怎么理解Task 1. 官方文檔是怎么描述線程 基本概念 從系統的角度看,線程是競爭系統資源的最小運行單元。
    的頭像 發表于 10-18 10:42 ?2484次閱讀
    <b class='flag-5'>鴻蒙</b>內核源碼Task/<b class='flag-5'>線程</b>技術分析

    鴻蒙OS 線程管理開發指導

    場景介紹 如果應用的業務邏輯比較復雜,可能需要創建多個線程來執行多個任務。這種情況下,代碼復雜難以維護,任務與線程的交互也會更加繁雜。要解決此問題,開發者可以使用“TaskDispatcher”來
    的頭像 發表于 01-29 16:22 ?1022次閱讀

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    并發模型是用來實現不同應用場景中并發任務的編程模型,常見的并發模型分為基于內存共享的并發模型和基于消息通信的并發模型。 Actor并發
    發表于 03-22 15:40

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(三)

    一、TaskPool注意事項 實現任務的函數需要使用裝飾器@Concurrent標注,且僅支持在.ets文件中使用。 實現任務的函數入參需滿足序列化支持的類型。 由于不同線程中上下文對象
    發表于 03-27 16:26

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程并發概述

    并發模型是用來實現不同應用場景中并發任務的編程模型,常見的并發模型分為基于內存共享的并發模型和基于消息通信的并發模型。 Actor并發
    發表于 03-28 14:35

    DevEco Studio AI輔助開發工具兩大升級功能 鴻蒙應用開發效率再提升

    數據支撐時提供相關的延伸指導。這種設計既保障了鴻蒙技術支持的專注度,又通過善意引導幫助用戶建立合理預期,最終實現開發者體驗與專業深度的雙提升。 隨著DeepSeek模型使用RAG能力增強之后
    發表于 04-18 14:43

    BearPi-HM_Nano開發鴻蒙OS內核編程開發——Thread多線程

    BearPi-HM_Nano開發鴻蒙OS內核編程開發——Thread多線程本示例將演示如何在BearPi-HM_Nano開發板上使用cms
    發表于 04-09 09:50

    線程服務器編程模型:如何正確使用mutex 和condition variable

    本文對多線程服務器的常用編程模型進行了一個詳細的解讀,本文中的多線程服務器是運行在 Linux 操作系統上網絡應用程序。介紹了典型的單線程服務器編程
    的頭像 發表于 02-19 08:29 ?7550次閱讀
    多<b class='flag-5'>線程</b>服務器編程<b class='flag-5'>模型</b>:如何正確使用mutex 和condition variable

    鴻蒙系統是基于什么開發

    爭議,那么鴻蒙系統到底是基于什么開發的呢?下面小編就為大家帶來鴻蒙系統是基于什么開發的答案。 鴻蒙系統是基于什么
    的頭像 發表于 07-05 17:12 ?1.2w次閱讀

    Linux應用開發【第五章】線程編程應用開發

    文章目錄 5 線程編程應用開發 5.1 線程的使用 5.1.1 為什么要使用多線程 5.1.2 線程概念 5.1.3
    的頭像 發表于 12-10 19:15 ?732次閱讀
    Linux應用<b class='flag-5'>開發</b>【第五章】<b class='flag-5'>線程</b>編程應用<b class='flag-5'>開發</b>

    介紹CUDA編程模型及CUDA線程體系

    CUDA 編程模型主要有三個關鍵抽象:層級的線程組,共享內存和柵同步(barrier synchronization)。
    的頭像 發表于 05-19 11:32 ?2392次閱讀
    介紹CUDA編程<b class='flag-5'>模型</b>及CUDA<b class='flag-5'>線程</b>體系

    SCP線程模型特點

    線程 混合協作調度模型-調度在具有相同優先級的線程之間是協作的。 ?無需鎖 ?使代碼更簡單,避免了死鎖的情況。 ?它消除了對執行上下文/RTOS的依賴,并防止了開銷。 ?事件在線程上下
    的頭像 發表于 11-02 17:07 ?803次閱讀
    SCP<b class='flag-5'>線程</b><b class='flag-5'>模型</b>特點

    使用 Taro 開發鴻蒙原生應用 —— 快速上手,鴻蒙應用開發指南

    隨著鴻蒙系統的不斷完善,許多應用廠商都希望將自己的應用移植到鴻蒙平臺上。最近,Taro 發布了 v4.0.0-beta.x 版本,支持使用 Taro 快速開發鴻蒙原生應用,也可將現有的
    的頭像 發表于 02-02 16:09 ?1308次閱讀
    使用 Taro <b class='flag-5'>開發</b><b class='flag-5'>鴻蒙</b>原生應用 —— 快速上手,<b class='flag-5'>鴻蒙</b>應用<b class='flag-5'>開發</b>指南

    鴻蒙開發:【線程模型

    管理其他線程的ArkTS引擎實例,例如使用TaskPool(任務池)創建任務或取消任務、啟動和終止Worker線程
    的頭像 發表于 06-13 16:38 ?667次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:【<b class='flag-5'>線程</b><b class='flag-5'>模型</b>】

    摩爾線程與智譜AI完成大模型性能測試與適配

    近日,摩爾線程與智譜AI在人工智能領域開展了一輪深入的合作,共同對GPU大模型進行了適配及性能測試。此次測試不僅涵蓋了大模型的推理能力,還涉及了基于摩爾線程夸娥(KUAE)千卡智算集群
    的頭像 發表于 06-14 16:40 ?1420次閱讀