使用Worker進(jìn)行長(zhǎng)時(shí)間數(shù)據(jù)分析
通過(guò)某地區(qū)提供的房?jī)r(jià)數(shù)據(jù)訓(xùn)練一個(gè)簡(jiǎn)易的房?jī)r(jià)預(yù)測(cè)模型,該模型支持通過(guò)輸入房屋面積和房間數(shù)量去預(yù)測(cè)該區(qū)域的房?jī)r(jià),模型需要長(zhǎng)時(shí)間運(yùn)行,房?jī)r(jià)預(yù)測(cè)需要使用前面的模型運(yùn)行結(jié)果,因此需要使用Worker。
1.DevEco Studio提供了Worker創(chuàng)建的模板,新建一個(gè)Worker線程,例如命名為“MyWorker”。

2.在主線程中通過(guò)調(diào)用ThreadWorker的constructor()方法創(chuàng)建Worker對(duì)象,當(dāng)前線程為宿主線程。
import worker from '@ohos.worker';
const workerInstance = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
3.在宿主線程中通過(guò)調(diào)用onmessage()方法接收Worker線程發(fā)送過(guò)來(lái)的消息,并通過(guò)調(diào)用postMessage()方法向Worker線程發(fā)送消息。
例如向Worker線程發(fā)送訓(xùn)練和預(yù)測(cè)的消息,同時(shí)接收Worker線程發(fā)送回來(lái)的消息。
// 接收Worker子線程的結(jié)果
workerInstance.onmessage = function(e) {
// data:Worker線程發(fā)送的信息
let data = e.data;
console.info('MyWorker.ts onmessage');
}
workerInstance.onerror = function (d) {
// 接收Worker子線程的錯(cuò)誤信息
}
// 向Worker子線程發(fā)送訓(xùn)練消息
workerInstance.postMessage({ 'type': 0 });
// 向Worker子線程發(fā)送預(yù)測(cè)消息
workerInstance.postMessage({ 'type': 1, 'value': [90, 5] });
4.在MyWorker.ts文件中綁定Worker對(duì)象,當(dāng)前線程為Worker線程。
import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';
let workerPort: ThreadWorkerGlobalScope = worker.workerPort;
5.在Worker線程中通過(guò)調(diào)用onmessage()方法接收宿主線程發(fā)送的消息內(nèi)容,并通過(guò)調(diào)用postMessage()方法向宿主線程發(fā)送消息。
例如在Worker線程中定義預(yù)測(cè)模型及其訓(xùn)練過(guò)程,同時(shí)與主線程進(jìn)行信息交互。
import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';
let workerPort: ThreadWorkerGlobalScope = worker.workerPort;
// 定義訓(xùn)練模型及結(jié)果
let result;
// 定義預(yù)測(cè)函數(shù)
function predict(x) {
return result[x];
}
// 定義優(yōu)化器訓(xùn)練過(guò)程
function optimize() {
result = {};
}
// Worker線程的onmessage邏輯
workerPort.onmessage = function (e: MessageEvents) {
let data = e.data
// 根據(jù)傳輸?shù)臄?shù)據(jù)的type選擇進(jìn)行操作
switch (data.type) {
case 0:
// 進(jìn)行訓(xùn)練
optimize();
// 訓(xùn)練之后發(fā)送主線程訓(xùn)練成功的消息
workerPort.postMessage({ type: 'message', value: 'train success.' });
break;
case 1:
// 執(zhí)行預(yù)測(cè)
const output = predict(data.value);
// 發(fā)送主線程預(yù)測(cè)的結(jié)果
workerPort.postMessage({ type: 'predict', value: output });
break;
default:
workerPort.postMessage({ type: 'message', value: 'send message is invalid' });
break;
}
}
在Worker線程中完成任務(wù)之后,執(zhí)行Worker線程銷(xiāo)毀操作。銷(xiāo)毀線程的方式主要有兩種:根據(jù)需要可以在宿主線程中對(duì)Worker線程進(jìn)行銷(xiāo)毀;也可以在Worker線程中主動(dòng)銷(xiāo)毀Worker線程。
6.在宿主線程中通過(guò)調(diào)用onexit()方法定義Worker線程銷(xiāo)毀后的處理邏輯。

// Worker線程銷(xiāo)毀后,執(zhí)行onexit回調(diào)方法
workerInstance.onexit = function() {
console.info("main thread terminate");
}```
| 鴻蒙OS開(kāi)發(fā) | HarmonyOS與OpenHarmony技術(shù) | |
|---|---|---|
| 方式一:在宿主線程中通過(guò)調(diào)用terminate()方法銷(xiāo)毀Worker線程,并終止Worker接收消息。 |
// 銷(xiāo)毀Worker線程
workerInstance.terminate();
方式二:在Worker線程中通過(guò)調(diào)用close()方法主動(dòng)銷(xiāo)毀Worker線程,并終止Worker接收消息。
// 銷(xiāo)毀線程
workerPort.close();
審核編輯 黃宇
-
cpu
+關(guān)注
關(guān)注
68文章
11279瀏覽量
224964 -
多線程
+關(guān)注
關(guān)注
0文章
279瀏覽量
21027 -
鴻蒙OS
+關(guān)注
關(guān)注
0文章
193瀏覽量
5484
發(fā)布評(píng)論請(qǐng)先 登錄
HarmonyOS CPU與I/O密集型任務(wù)開(kāi)發(fā)指導(dǎo)
鴻蒙OS開(kāi)發(fā)實(shí)例:【ArkTS類庫(kù)多線程CPU密集型任務(wù)TaskPool】
鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)概述
鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程CPU密集型任務(wù)TaskPool
鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程I/O密集型任務(wù)開(kāi)發(fā)
鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程TaskPool和Worker的對(duì)比(一)
鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程TaskPool和Worker的對(duì)比(二)
鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程TaskPool和Worker的對(duì)比(三)
CPU密集型任務(wù)開(kāi)發(fā)指導(dǎo)
I/O密集型任務(wù)開(kāi)發(fā)指導(dǎo)
HarmonyOS CPU與I/O密集型任務(wù)開(kāi)發(fā)指導(dǎo)
HarmonyOS語(yǔ)言基礎(chǔ)類庫(kù)開(kāi)發(fā)指南上線啦!
鴻蒙APP開(kāi)發(fā):【ArkTS類庫(kù)多線程】TaskPool和Worker的對(duì)比
鴻蒙APP開(kāi)發(fā):【ArkTS類庫(kù)多線程】TaskPool和Worker的對(duì)比(2)
鴻蒙OS開(kāi)發(fā)實(shí)例:【ArkTS類庫(kù)多線程I/O密集型任務(wù)開(kāi)發(fā)】
鴻蒙OS開(kāi)發(fā)案例:【ArkTS類庫(kù)多線程CPU密集型任務(wù)Worker】
評(píng)論