相关概念
概念
说明
宿主进程
创建Worker的线程称为宿主线程(不一定是主线程,工作线程也支持创建Worker子线程)
Worker子线程(或Actor线程、工作线程)
Worker自身的线程
序列化机制
Worker通过序列化机制与宿主线程之间相互通信,完成命令及数据交互
每个Worker子线程与宿主线程拥有独立的实例,包含基础设施、对象、代码段等,因此每个Worker启动存在一定的内存开销,需要限制Worker的子线程数量
创建
手动
"buildOption" : { "sourceOption" : { "workers" : [ "./src/main/ets/workers/worker.ets" ] } }
自动
{moduleName}目录下任意位置,点击鼠标右键 > New > Worker
使用
导入模块
宿主线程指定worker,通过postMessage发送信息
worker中执行业务逻辑
worker子线程通过onMessage和postMessage向宿主线程报告执行结果
宿主线程通过onerror和onmeesage接受结果
销毁:宿主onexit后,宿主terminate 或 worker close
导入
import { worker } from '@kit.ArkTS' ;const worker1 : worker.ThreadWorker = new worker.ThreadWorker ('entry/ets/workers/MyWorker.ets' );const worker2 : worker.Worker = new worker.Worker ('entry/ets/workers/MyWorker.ets' );
加载
import { worker } from '@kit.ArkTS' ;const workerStage1 : worker.ThreadWorker = new worker.ThreadWorker ('entry/ets/workers/worker.ets' );const workerStage2 : worker.ThreadWorker = new worker.ThreadWorker ('phone/ets/ThreadFile/workers/worker.ets' );import { worker } from '@kit.ArkTS' ;const workerStage3 : worker.ThreadWorker = new worker.ThreadWorker ('hsp/ets/workers/worker.ets' );import { worker } from '@kit.ArkTS' ;const workerStage4 : worker.ThreadWorker = new worker.ThreadWorker ('@har/ets/workers/worker.ets' );const workerStage5 : worker.ThreadWorker = new worker.ThreadWorker ('../../workers/worker.ets' );
示例
<!---Index .ts ---!> import { worker } from '@kit.ArkTS' ;const workerInstance : worker.ThreadWorker = new worker.ThreadWorker ('entry/ets/workers/MyWorker.ts' );let done = false ;workerInstance.onmessage = (() => { console .info ('MyWorker.ts onmessage' ); if (!done) { workerInstance.postMessage ({ 'type' : 1 , 'value' : 0 }); done = true ; } }) workerInstance.onerror = (() => { }) workerInstance.postMessage ({ 'type' : 0 }); workerInstance.onexit = (): void => { console .info ("main thread terminate" ); } workerInstance.terminate (); <!---MyWorker .ts ---!> import { worker, ThreadWorkerGlobalScope , MessageEvents , ErrorEvent } from '@kit.ArkTS' ;let workerPort : ThreadWorkerGlobalScope = worker.workerPort ;workerPort.onmessage = (e : MessageEvents ): void => { 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 ; } workerPort.close ();
同步任务(多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行)示例
生命周期
由开发者自行维护
调用terminate()接口或close()方法主动销毁Worker
注意事项
Worker空闲时也会一直运行
设定的内存阈值为1.5GB和设备物理内存的60%中的较小者
系统最多可以同时运行64个Worker
使用场景
运行时间超过3分钟的CPU密集型
有关联的一系列同步任务(无法单例创建的类对象实现的方法)