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

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

3天內不再提示

鴻蒙OS開發案例:【ArkTS類庫多線程CPU密集型任務Worker】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-01 21:55 ? 次閱讀

使用Worker進行長時間數據分析

通過某地區提供的房價數據訓練一個簡易的房價預測模型,該模型支持通過輸入房屋面積和房間數量去預測該區域的房價,模型需要長時間運行,房價預測需要使用前面的模型運行結果,因此需要使用Worker。

1.DevEco Studio提供了Worker創建的模板,新建一個Worker線程,例如命名為“MyWorker”。

2.在主線程中通過調用ThreadWorker的constructor()方法創建Worker對象,當前線程為宿主線程。

import worker from '@ohos.worker';

const workerInstance = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');

3.在宿主線程中通過調用onmessage()方法接收Worker線程發送過來的消息,并通過調用postMessage()方法向Worker線程發送消息。

例如向Worker線程發送訓練和預測的消息,同時接收Worker線程發送回來的消息。

// 接收Worker子線程的結果
workerInstance.onmessage = function(e) {
  // data:Worker線程發送的信息
  let data = e.data;
  console.info('MyWorker.ts onmessage');
}

workerInstance.onerror = function (d) {
  // 接收Worker子線程的錯誤信息
}

// 向Worker子線程發送訓練消息
workerInstance.postMessage({ 'type': 0 });
// 向Worker子線程發送預測消息
workerInstance.postMessage({ 'type': 1, 'value': [90, 5] });

4.在MyWorker.ts文件中綁定Worker對象,當前線程為Worker線程。

import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';

let workerPort: ThreadWorkerGlobalScope = worker.workerPort;

5.在Worker線程中通過調用onmessage()方法接收宿主線程發送的消息內容,并通過調用postMessage()方法向宿主線程發送消息。

例如在Worker線程中定義預測模型及其訓練過程,同時與主線程進行信息交互。

import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';

let workerPort: ThreadWorkerGlobalScope = worker.workerPort;

// 定義訓練模型及結果 
let result;

// 定義預測函數
function predict(x) {
  return result[x];
}

// 定義優化器訓練過程
function optimize() {
  result = {};
}

// Worker線程的onmessage邏輯
workerPort.onmessage = function (e: MessageEvents) {
  let data = e.data
  // 根據傳輸的數據的type選擇進行操作
  switch (data.type) {
    case 0:
    // 進行訓練
      optimize();
    // 訓練之后發送主線程訓練成功的消息
      workerPort.postMessage({ type: 'message', value: 'train success.' });
      break;
    case 1:
    // 執行預測
      const output = predict(data.value);
    // 發送主線程預測的結果
      workerPort.postMessage({ type: 'predict', value: output });
      break;
    default:
      workerPort.postMessage({ type: 'message', value: 'send message is invalid' });
      break;
  }
}

在Worker線程中完成任務之后,執行Worker線程銷毀操作。銷毀線程的方式主要有兩種:根據需要可以在宿主線程中對Worker線程進行銷毀;也可以在Worker線程中主動銷毀Worker線程。

6.在宿主線程中通過調用onexit()方法定義Worker線程銷毀后的處理邏輯。

搜狗高速瀏覽器截圖20240326151547.png

// Worker線程銷毀后,執行onexit回調方法
workerInstance.onexit = function() {
  console.info("main thread terminate");
}```
鴻蒙OS開發HarmonyOSOpenHarmony技術
方式一:在宿主線程中通過調用terminate()方法銷毀Worker線程,并終止Worker接收消息。
// 銷毀Worker線程
workerInstance.terminate();

方式二:在Worker線程中通過調用close()方法主動銷毀Worker線程,并終止Worker接收消息。

// 銷毀線程
workerPort.close();

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

    關注

    68

    文章

    10512

    瀏覽量

    207279
  • 多線程
    +關注

    關注

    0

    文章

    271

    瀏覽量

    19760
  • 鴻蒙OS
    +關注

    關注

    0

    文章

    189

    瀏覽量

    4304
收藏 人收藏

    評論

    相關推薦

    HarmonyOS CPU與I/O密集型任務開發指導

    分析等。 基于多線程并發機制處理CPU密集型任務可以提高CPU利用率,提升應用程序響應速度。 當進行一系列同步
    的頭像 發表于 02-18 10:17 ?701次閱讀
    HarmonyOS <b class='flag-5'>CPU</b>與I/O<b class='flag-5'>密集型</b><b class='flag-5'>任務</b><b class='flag-5'>開發</b>指導

    鴻蒙OS開發實例:【ArkTS類庫多線程CPU密集型任務TaskPool】

    CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主
    的頭像 發表于 04-01 22:25 ?400次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發</b>實例:【<b class='flag-5'>ArkTS</b>類庫<b class='flag-5'>多線程</b><b class='flag-5'>CPU</b><b class='flag-5'>密集型</b><b class='flag-5'>任務</b>TaskPool】

    ArkTS語言基礎-解析

    ArkTS語言基礎是HarmonyOS系統上為應用開發者提供的常用基礎能力,主要包含能力如下圖所示。 圖1 ArkTS語言基礎
    發表于 02-20 16:44

    鴻蒙原生應用開發-ArkTS語言基礎概述

    ArkTS語言基礎是HarmonyOS系統上為應用開發者提供的常用基礎能力,主要包含能力如下圖所示。 1.提供異步并發和多線程并發的能
    發表于 03-05 15:42

    鴻蒙原生應用開發-ArkTS語言基礎多線程CPU密集型任務TaskPool

    CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主
    發表于 03-19 14:14

    鴻蒙原生應用開發-ArkTS語言基礎多線程I/O密集型任務開發

    使用異步并發可以解決單次I/O任務阻塞的問題,但是如果遇到I/O密集型任務,同樣會阻塞線程中其它任務的執行,這時需要使用
    發表于 03-21 14:57

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

    TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型
    發表于 03-25 14:11

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

    TaskPool運作機制 圖1 TaskPool運作機制示意圖 TaskPool支持開發者在主線程封裝任務拋給任務隊列,系統選擇合適的工作線程
    發表于 03-26 15:25

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

    是不同的,因此TaskPool工作線程只能使用線程安全的,例如UI相關的非線程安全不能使用。 序列化傳輸的數據量大小限制為16MB。 二
    發表于 03-27 16:26

    什么時候要使用多線程

    什么時候要使用多線程cpu密集型:(比如一個while( true ){ i++;})IO密集型:(比如一個從磁盤拷貝數據到另一個磁盤的拷貝進程)1)計算
    發表于 09-06 07:25

    python多線程和多進程對比

    電視邊吃飯邊聊天。這就是我們的 多進程 才能做的事了。2. 單線程VS多線程VS多進程文字總是蒼白無力的,不如用代碼直接來測試一下。開始對比之前,首先定義四種類型的場景 - CPU計算密集型
    發表于 03-15 16:42

    HarmonyOS CPU與I/O密集型任務開發指導

    。 基于多線程并發機制處理CPU密集型任務可以提高CPU利用率,提升應用程序響應速度。 當進行一系列同步
    發表于 09-26 16:29

    HarmonyOS語言基礎開發指南上線啦!

    并發能力,適用于單次I/O任務開發場景。 ○ TaskPool和Worker提供多線程并發能力,適用于CPU
    發表于 10-18 16:36

    鴻蒙APP開發:【ArkTS類庫多線程】TaskPool和Worker的對比

    TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型
    的頭像 發表于 03-26 22:09 ?153次閱讀
    <b class='flag-5'>鴻蒙</b>APP<b class='flag-5'>開發</b>:【<b class='flag-5'>ArkTS</b>類庫<b class='flag-5'>多線程</b>】TaskPool和<b class='flag-5'>Worker</b>的對比

    鴻蒙OS開發實例:【ArkTS類庫多線程I/O密集型任務開發

    使用異步并發可以解決單次I/O任務阻塞的問題,但是如果遇到I/O密集型任務,同樣會阻塞線程中其它任務的執行,這時需要使用
    的頭像 發表于 04-01 16:32 ?158次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發</b>實例:【<b class='flag-5'>ArkTS</b>類庫<b class='flag-5'>多線程</b>I/O<b class='flag-5'>密集型</b><b class='flag-5'>任務</b><b class='flag-5'>開發</b>】
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>