相关概念

概念 说明
宿主进程 创建Worker的线程称为宿主线程(不一定是主线程,工作线程也支持创建Worker子线程)
Worker子线程(或Actor线程、工作线程) Worker自身的线程
序列化机制 Worker通过序列化机制与宿主线程之间相互通信,完成命令及数据交互
  1. 每个Worker子线程与宿主线程拥有独立的实例,包含基础设施、对象、代码段等,因此每个Worker启动存在一定的内存开销,需要限制Worker的子线程数量

创建

  1. 手动
//build-profile.json5
"buildOption": {
"sourceOption": {
"workers": [
"./src/main/ets/workers/worker.ets"
]
}
}
  1. 自动
    {moduleName}目录下任意位置,点击鼠标右键 > New > Worker

使用

  1. 导入模块
  2. 宿主线程指定worker,通过postMessage发送信息
  3. worker中执行业务逻辑
  4. worker子线程通过onMessage和postMessage向宿主线程报告执行结果
  5. 宿主线程通过onerror和onmeesage接受结果
  6. 销毁:宿主onexit后,宿主terminate 或 worker close

导入

// 导入模块
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');

加载

//1) 加载Ability中Worker线程文件场景
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) 加载HSP中Worker线程文件场景
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) 加载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');

示例

<!---Index.ts ---!>
import { worker } from '@kit.ArkTS';
// 指定worker
const workerInstance: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
let done = false;
// 接收Worker子线程的结果
workerInstance.onmessage = (() => {
console.info('MyWorker.ts onmessage');
if (!done) {
workerInstance.postMessage({ 'type': 1, 'value': 0 });
done = true;
}
})
workerInstance.onerror = (() => {
// 接收Worker子线程的错误信息
})
// 向Worker子线程发送训练消息
workerInstance.postMessage({ 'type': 0 });
// Worker线程销毁后,执行onexit回调方法
workerInstance.onexit = (): void => {
console.info("main thread terminate");
}
// 方法一:宿主销毁Worker线程
workerInstance.terminate();

<!---MyWorker.ts ---!>
import { worker, ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@kit.ArkTS';

let workerPort: ThreadWorkerGlobalScope = worker.workerPort;
// MyWorker.ts
// 省略业务逻辑
// Worker线程的onmessage逻辑
workerPort.onmessage = (e: MessageEvents): void => {
// 根据传输的数据的type选择进行操作
switch (e.data.type as number) {
case 0:
// 进行训练
optimize();
// 训练之后发送主线程训练成功的消息
workerPort.postMessage({ type: 'message', value: 'train success.' });
break;
case 1:
// 执行预测
const output: number = predict(e.data.value as number);
// 发送主线程预测的结果
workerPort.postMessage({ type: 'predict', value: output });
break;
default:
workerPort.postMessage({ type: 'message', value: 'send message is invalid' });
break;
}
// 方法2:worker销毁自己
workerPort.close();

同步任务(多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行)示例


生命周期

  • 由开发者自行维护
  • 调用terminate()接口或close()方法主动销毁Worker

注意事项

  • Worker空闲时也会一直运行
  • 设定的内存阈值为1.5GB和设备物理内存的60%中的较小者
  • 系统最多可以同时运行64个Worker

使用场景

  1. 运行时间超过3分钟的CPU密集型
  2. 有关联的一系列同步任务(无法单例创建的类对象实现的方法)