使用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線程銷毀后的處理邏輯。
// Worker線程銷毀后,執行onexit回調方法
workerInstance.onexit = function() {
console.info("main thread terminate");
}```
鴻蒙OS開發 | HarmonyOS與OpenHarmony技術 | |
---|---|---|
方式一:在宿主線程中通過調用terminate()方法銷毀Worker線程,并終止Worker接收消息。 |
// 銷毀Worker線程
workerInstance.terminate();
方式二:在Worker線程中通過調用close()方法主動銷毀Worker線程,并終止Worker接收消息。
// 銷毀線程
workerPort.close();
審核編輯 黃宇
-
cpu
+關注
關注
68文章
10863瀏覽量
211767 -
多線程
+關注
關注
0文章
278瀏覽量
19956 -
鴻蒙OS
+關注
關注
0文章
188瀏覽量
4392
發布評論請先 登錄
相關推薦
評論