• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Worker简介
2
3Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与主线程分离,在后台线程中运行一个脚本操作耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。具体接口信息及使用方法详情请见[Worker](../reference/apis/js-apis-worker.md)。
4
5
6## Worker运作机制
7
8**图1** Worker运作机制示意图
9
10![worker](figures/worker.png)
11
12创建Worker的线程称为宿主线程(不一定是主线程,工作线程也支持创建Worker子线程),Worker自身的线程称为Worker子线程(或Actor线程、工作线程)。每个Worker子线程与宿主线程拥有独立的实例,包含基础设施、对象、代码段等。Worker子线程和宿主线程之间的通信是基于消息传递的,Worker通过序列化机制与宿主线程之间相互通信,完成命令及数据交互。
13
14
15## Worker注意事项
16
17- 创建Worker时,传入的Worker.ts路径在不同版本有不同的规则,详情请参见[文件路径注意事项](#文件路径注意事项)。
18
19- Worker创建后需要手动管理生命周期,且最多同时运行的Worker子线程数量为8个,详情请参见[生命周期注意事项](#生命周期注意事项)。
20
21- [Ability类型](../quick-start/application-package-structure-stage.md)的Module支持使用Worker,[Library类型](../quick-start/application-package-structure-stage.md)的Module不支持使用Worker。
22
23- 创建Worker不支持使用其他Module的Worker.ts文件,即不支持跨模块调用Worker。
24
25- 由于不同线程中上下文对象是不同的,因此Worker线程只能使用线程安全的库,例如UI相关的非线程安全库不能使用。
26
27- 序列化传输的数据量大小限制为16MB。
28
29- 使用Worker模块时,需要在主线程中注册onerror接口,否则当worker线程出现异常时会发生jscrash问题。
30
31
32### 文件路径注意事项
33
34  当使用Worker模块具体功能时,均需先构造Worker实例对象,其构造函数与API版本相关。
35
36```ts
37// 导入模块
38import worker from '@ohos.worker';
39
40// API 9及之后版本使用:
41const worker1: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
42// API 8及之前版本使用:
43const worker2: worker.Worker = new worker.Worker('entry/ets/workers/MyWorker.ts');
44```
45
46构造函数需要传入Worker的路径(scriptURL),Worker文件存放位置默认路径为Worker文件所在目录与pages目录属于同级。
47
48**Stage模型**
49
50构造函数中的scriptURL示例如下:
51
52
53```ts
54// 导入模块
55import worker from '@ohos.worker';
56
57// 写法一
58// Stage模型-目录同级(entry模块下,workers目录与pages目录同级)
59const worker1: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts', {name:"first worker in Stage model"});
60// Stage模型-目录不同级(entry模块下,workers目录是pages目录的子目录)
61const worker2: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/pages/workers/MyWorker.ts');
62
63// 写法二
64// Stage模型-目录同级(entry模块下,workers目录与pages目录同级),假设bundlename是com.example.workerdemo
65const worker3: worker.ThreadWorker = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/workers/worker');
66// Stage模型-目录不同级(entry模块下,workers目录是pages目录的子目录),假设bundlename是com.example.workerdemo
67const worker4: worker.ThreadWorker = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/pages/workers/worker');
68```
69
70
71- 基于Stage模型工程目录结构,写法一的路径含义:
72  - entry:module.json5文件中module的name属性对应值。
73  - ets:用于存放ets源码,固定目录。
74  - workers/MyWorker.ts:worker源文件在ets目录下的路径。
75
76- 基于Stage模型工程目录结构,写法二的路径含义:
77  - \@bundle:固定标签。
78  - bundlename:当前应用包名。
79  - entryname:module.json5文件中module的name属性对应值。
80  - ets:用于存放ets源码,固定目录。
81  - workerdir/workerfile:worker源文件在ets目录下的路径,可不带文件后缀名。
82
83
84**FA模型**
85
86
87  构造函数中的scriptURL示例如下:
88
89```ts
90// 导入模块
91import worker from '@ohos.worker';
92
93// FA模型-目录同级(entry模块下,workers目录与pages目录同级)
94const worker1: worker.ThreadWorker = new worker.ThreadWorker('workers/worker.js', {name:'first worker in FA model'});
95// FA模型-目录不同级(entry模块下,workers目录与pages目录的父目录同级)
96const worker2: worker.ThreadWorker = new worker.ThreadWorker('../workers/worker.js');
97```
98
99
100### 生命周期注意事项
101
102- Worker的创建和销毁耗费性能,建议开发者合理管理已创建的Worker并重复使用。Worker空闲时也会一直运行,因此当不需要Worker时,可以调用[terminate()](../reference/apis/js-apis-worker.md#terminate9)接口或[parentPort.close()](../reference/apis/js-apis-worker.md#close9)方法主动销毁Worker。若Worker处于已销毁或正在销毁等非运行状态时,调用其功能接口,会抛出相应的错误。
103
104
105- Worker存在数量限制,支持最多同时存在8个Worker。
106  - 在API version 8及之前的版本,当Worker数量超出限制时,会抛出“Too many workers, the number of workers exceeds the maximum.”错误。
107  - 从API version 9开始,当Worker数量超出限制时,会抛出“Worker initialization failure, the number of workers exceeds the maximum.”错误。
108