当前位置:   article > 正文

鸿蒙OS开发案例:【ArkTS类库多线程CPU密集型任务Worker】

鸿蒙OS开发案例:【ArkTS类库多线程CPU密集型任务Worker】

 使用Worker进行长时间数据分析

通过某地区提供的房价数据训练一个简易的房价预测模型,该模型支持通过输入房屋面积和房间数量去预测该区域的房价,模型需要长时间运行,房价预测需要使用前面的模型运行结果,因此需要使用Worker。

1.DevEco Studio提供了Worker创建的模板,新建一个Worker线程,例如命名为“MyWorker”。

2.在主线程中通过调用ThreadWorker的constructor()方法创建Worker对象,当前线程为宿主线程。

  1. import worker from '@ohos.worker';
  2. const workerInstance = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');

3.在宿主线程中通过调用onmessage()方法接收Worker线程发送过来的消息,并通过调用postMessage()方法向Worker线程发送消息。

例如向Worker线程发送训练和预测的消息,同时接收Worker线程发送回来的消息。

  1. // 接收Worker子线程的结果
  2. workerInstance.onmessage = function(e) {
  3. // data:Worker线程发送的信息
  4. let data = e.data;
  5. console.info('MyWorker.ts onmessage');
  6. }
  7. workerInstance.onerror = function (d) {
  8. // 接收Worker子线程的错误信息
  9. }
  10. // 向Worker子线程发送训练消息
  11. workerInstance.postMessage({ 'type': 0 });
  12. // 向Worker子线程发送预测消息
  13. workerInstance.postMessage({ 'type': 1, 'value': [90, 5] });

4.在MyWorker.ts文件中绑定Worker对象,当前线程为Worker线程。

  1. import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';
  2. let workerPort: ThreadWorkerGlobalScope = worker.workerPort;

5.在Worker线程中通过调用onmessage()方法接收宿主线程发送的消息内容,并通过调用postMessage()方法向宿主线程发送消息。

例如在Worker线程中定义预测模型及其训练过程,同时与主线程进行信息交互。

  1. import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';
  2. let workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  3. // 定义训练模型及结果
  4. let result;
  5. // 定义预测函数
  6. function predict(x) {
  7. return result[x];
  8. }
  9. // 定义优化器训练过程
  10. function optimize() {
  11. result = {};
  12. }
  13. // Worker线程的onmessage逻辑
  14. workerPort.onmessage = function (e: MessageEvents) {
  15. let data = e.data
  16. // 根据传输的数据的type选择进行操作
  17. switch (data.type) {
  18. case 0:
  19. // 进行训练
  20. optimize();
  21. // 训练之后发送主线程训练成功的消息
  22. workerPort.postMessage({ type: 'message', value: 'train success.' });
  23. break;
  24. case 1:
  25. // 执行预测
  26. const output = predict(data.value);
  27. // 发送主线程预测的结果
  28. workerPort.postMessage({ type: 'predict', value: output });
  29. break;
  30. default:
  31. workerPort.postMessage({ type: 'message', value: 'send message is invalid' });
  32. break;
  33. }
  34. }

在Worker线程中完成任务之后,执行Worker线程销毁操作。销毁线程的方式主要有两种:根据需要可以在宿主线程中对Worker线程进行销毁;也可以在Worker线程中主动销毁Worker线程。

6.在宿主线程中通过调用onexit()方法定义Worker线程销毁后的处理逻辑。

搜狗高速浏览器截图20240326151547.png

  1. // Worker线程销毁后,执行onexit回调方法
  2. workerInstance.onexit = function() {
  3. console.info("main thread terminate");
  4. }
鸿蒙OS开发开发知识更新库qr23.cn/AKFP8k### 参考前往。HarmonyOS与OpenHarmony技术
方式一:在宿主线程中通过调用terminate()方法销毁Worker线程,并终止Worker接收消息。
  1. // 销毁Worker线程
  2. workerInstance.terminate();

方式二:在Worker线程中通过调用close()方法主动销毁Worker线程,并终止Worker接收消息。

  1. // 销毁线程
  2. workerPort.close();

鸿蒙Next核心技术分享

1、鸿蒙基础知识←《鸿蒙NEXT星河版开发学习文档》

2、鸿蒙ArkUI←《鸿蒙NEXT星河版开发学习文档》

3、鸿蒙进阶技术←《鸿蒙NEXT星河版开发学习文档》

 4、鸿蒙就业高级技能←《鸿蒙NEXT星河版开发学习文档》 

 5、鸿蒙多媒体技术←《鸿蒙NEXT星河版开发学习文档》 

6、鸿蒙南向驱动开发←《鸿蒙NEXT星河版开发学习文档》  

7、鸿蒙南向内核设备开发←《鸿蒙NEXT星河版开发学习文档》  

 8、鸿蒙系统裁剪与移植←《鸿蒙NEXT星河版开发学习文档》  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/360344
推荐阅读
相关标签
  

闽ICP备14008679号