1# @ohos.taskpool(使用任务池) 2 3任务池(taskpool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任务进行如任务执行、任务取消的操作。理论上您可以使用任务池API创建数量不受限制的任务,但是出于内存因素不建议您这样做。此外,不建议您在任务中执行阻塞操作,特别是无限期阻塞操作,长时间的阻塞操作占据工作线程,可能会阻塞其他任务调度,影响您的应用性能。 4 5您所创建的同一优先级任务的执行顺序可以由您决定,任务真实执行的顺序与您调用任务池API提供的任务执行接口顺序一致。任务默认优先级是MEDIUM。(任务优先级机制暂未支持) 6 7当同一时间待执行的任务数量大于任务池工作线程数量,任务池会根据负载均衡机制进行扩容,增加工作线程数量,减少整体等待时长。同样,当执行的任务数量减少,工作线程数量大于执行任务数量,部分工作线程处于空闲状态,任务池会根据负载均衡机制进行缩容,减少工作线程数量。(负载均衡机制暂未支持) 8 9任务池API以数字形式返回错误码。有关各个错误码的更多信息,请参阅文档[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 10 11> **说明:**<br/> 12> 本模块首批接口从API version 9 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 13 14## 导入模块 15 16```ts 17import taskpool from '@ohos.taskpool'; 18``` 19 20## Priority 21 22表示所创建任务(Task)的优先级。(暂未支持) 23 24**系统能力:** SystemCapability.Utils.Lang 25 26| 名称 | 值 | 说明 | 27| -------- | -------- | -------- | 28| HIGH | 0 | 任务为高优先级。 | 29| MEDIUM | 1 | 任务为中优先级。 | 30| LOW | 2 | 任务为低优先级。 | 31 32## Task 33 34表示任务。使用以下方法前,需要先构造Task。 35 36### constructor 37 38constructor(func: Function, ...args: unknown[]) 39 40Task的构造函数。 41 42**系统能力:** SystemCapability.Utils.Lang 43 44**参数:** 45 46| 参数名 | 类型 | 必填 | 说明 | 47| ------ | --------- | ---- | -------------------------------------------------------------------- | 48| func | Function | 是 | 任务执行需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 49| args | unknown[] | 否 | 任务执行传入函数的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。 | 50 51**错误码:** 52 53以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 54 55| 错误码ID | 错误信息 | 56| -------- | --------------------------------------- | 57| 10200014 | The function is not mark as concurrent. | 58 59**示例:** 60 61```ts 62@Concurrent 63function func(args) { 64 console.log("func: " + args); 65 return args; 66} 67 68let task = new taskpool.Task(func, "this is my first Task"); 69``` 70 71### 属性 72 73**系统能力:** SystemCapability.Utils.Lang 74 75| 名称 | 类型 | 可读 | 可写 | 说明 | 76| --------- | --------- | ---- | ---- | ------------------------------------------------------------------------- | 77| function | Function | 是 | 是 | 创建任务时需要传入的函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 78| arguments | unknown[] | 是 | 是 | 创建任务传入函数所需的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。 | 79 80## taskpool.execute 81 82execute(func: Function, ...args: unknown[]): Promise\<unknown> 83 84任务池执行任务,需要传入待执行的函数和函数所需的参数,此执行模式不可取消任务。 85 86**系统能力:** SystemCapability.Utils.Lang 87 88**参数:** 89 90| 参数名 | 类型 | 必填 | 说明 | 91| ------ | --------- | ---- | ---------------------------------------------------------------------- | 92| func | Function | 是 | 执行的逻辑需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 93| args | unknown[] | 否 | 执行逻辑的函数所需要的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。 | 94 95**返回值:** 96 97| 类型 | 说明 | 98| ----------------- | ------------------------------------ | 99| Promise\<unknown> | execute是异步方法,返回Promise对象。 | 100 101**错误码:** 102 103以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 104 105| 错误码ID | 错误信息 | 106| -------- | ----------------------------------------- | 107| 10200003 | Worker initialization failure. | 108| 10200006 | Serializing an uncaught exception failed. | 109| 10200014 | The function is not mark as concurrent. | 110 111**示例:** 112 113```ts 114@Concurrent 115function func(args) { 116 console.log("func: " + args); 117 return args; 118} 119 120async function taskpoolTest() { 121 let value = await taskpool.execute(func, 100); 122 console.log("taskpool result: " + value); 123} 124 125taskpoolTest(); 126``` 127 128## taskpool.execute 129 130execute(task: Task, priority?: Priority): Promise\<unknown> 131 132任务池执行任务,需要传入已创建的任务,此执行模式可取消任务。 133 134**系统能力:** SystemCapability.Utils.Lang 135 136**参数:** 137 138| 参数名 | 类型 | 必填 | 说明 | 139| -------- | --------------------- | ---- | ------------------------------------ | 140| task | [Task](#task) | 是 | 需要在任务池中执行的任务。 | 141| priority | [Priority](#priority) | 否 | 等待执行的任务的优先级(暂未支持)。 | 142 143**返回值:** 144 145| 类型 | 说明 | 146| ---------------- | ------------------------------ | 147| Promise\<unknown> | execute是异步方法,返回Promise对象。 | 148 149**错误码:** 150 151以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 152 153| 错误码ID | 错误信息 | 154| -------- | ----------------------------------------- | 155| 10200003 | Worker initialization failure. | 156| 10200006 | Serializing an uncaught exception failed. | 157| 10200014 | The function is not mark as concurrent. | 158 159**示例:** 160 161```ts 162@Concurrent 163function func(args) { 164 console.log("func: " + args); 165 return args; 166} 167 168async function taskpoolTest() { 169 let task = new taskpool.Task(func, 100); 170 let value = await taskpool.execute(task); 171 console.log("taskpool result: " + value); 172} 173 174taskpoolTest(); 175``` 176 177## taskpool.cancel 178 179cancel(task: Task): void 180 181取消任务池中的任务。 182 183**系统能力:** SystemCapability.Utils.Lang 184 185**参数:** 186 187| 参数名 | 类型 | 必填 | 说明 | 188| ------ | ------------- | ---- | -------------------- | 189| task | [Task](#task) | 是 | 需要取消执行的任务。 | 190 191**错误码:** 192 193以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 194 195| 错误码ID | 错误信息 | 196| -------- | ------------------------- | 197| 10200015 | If the task is not exist. | 198| 10200016 | If the task is running. | 199 200**示例:** 201 202```ts 203@Concurrent 204function func(args) { 205 console.log("func: " + args); 206 return args; 207} 208 209async function taskpoolTest() { 210 let task = new taskpool.Task(func, 100); 211 let value = await taskpool.execute(task); 212 try { 213 taskpool.cancel(task); 214 } catch (e) { 215 console.log("taskpool.cancel occur error:" + e); 216 } 217} 218 219taskpoolTest(); 220``` 221 222## 其他说明 223 224### 序列化支持类型 225序列化支持类型包括:All Primitive Type(不包括symbol)、Date、String、RegExp、Array、Map、Set、Object、ArrayBuffer、TypedArray。 226 227### 注意事项 228- 仅支持在Stage模型且module的compileMode为esmodule的project中使用taskpool api。确认module的compileMode方法:查看当前module的build-profile.json5,在buildOption中补充"compileMode": "esmodule"。 229- taskpool任务只支持引用入参传递或者import的变量,不支持使用闭包变量,使用装饰器@Concurrent进行拦截。 230- taskpool任务只支持普通函数或者async函数,不支持类成员函数或者匿名函数,使用装饰器@Concurrent进行拦截。 231- 装饰器@Concurrent仅支持在ets文件使用,在ts文件中创建taskpool任务需使用"use concurrent"。 232 233### 简单使用 234 235**示例一** 236 237```ts 238// 支持普通函数、引用入参传递 239@Concurrent 240function func(args) { 241 console.log("func: " + args); 242 return args; 243} 244 245async function taskpoolTest() { 246 // taskpool.execute(task) 247 let task = new taskpool.Task(func, "create task, then execute"); 248 let val1 = await taskpool.execute(task); 249 console.log("taskpool.execute(task) result: " + val1); 250 251 // taskpool.execute(function) 252 let val2 = await taskpool.execute(func, "execute task by func"); 253 console.log("taskpool.execute(function) result: " + val2); 254} 255 256taskpoolTest(); 257``` 258 259**示例二** 260 261```ts 262// b.ets 263export var c = 2000; 264``` 265```ts 266// 引用import变量 267// a.ets(与b.ets位于同一目录中) 268import { c } from "./b"; 269 270@Concurrent 271function test(a) { 272 console.log(a); 273 console.log(c); 274 return a; 275} 276 277async function taskpoolTest() { 278 // taskpool.execute(task) 279 let task = new taskpool.Task(test, "create task, then execute"); 280 let val1 = await taskpool.execute(task); 281 console.log("taskpool.execute(task) result: " + val1); 282 283 // taskpool.execute(function) 284 let val2 = await taskpool.execute(test, "execute task by func"); 285 console.log("taskpool.execute(function) result: " + val2); 286} 287 288taskpoolTest(); 289``` 290 291**示例三** 292 293```ts 294// 支持async函数 295@Concurrent 296async function task() { 297 let ret = await Promise.all([ 298 new Promise(resolve => setTimeout(resolve, 1000, "resolved")) 299 ]); 300 return ret; 301} 302 303async function taskpoolTest() { 304 taskpool.execute(task).then((result) => { 305 console.log("TaskPoolTest task result: " + result); 306 }); 307} 308 309taskpoolTest(); 310``` 311 312**示例四** 313 314```ts 315// 在ts文件中创建taskpool任务需使用"use concurrent" 316// c.ts 317function test1(n) { 318 "use concurrent" 319 return n; 320} 321export async function taskpoolTest1() { 322 console.log("taskpoolTest1 start"); 323 var task = new taskpool.Task(test1, 100); 324 var result = await taskpool.execute(task); 325 console.log("taskpoolTest1 result:" + result); 326} 327 328async function test2() { 329 "use concurrent" 330 var ret = await Promise.all([ 331 new Promise(resolve => setTimeout(resolve, 1000, "resolved")) 332 ]); 333 return ret; 334} 335export async function taskpoolTest2() { 336 console.log("taskpoolTest2 start"); 337 taskpool.execute(test2).then((result) => { 338 console.log("TaskPoolTest2 result: " + result); 339 }); 340} 341``` 342 343```ts 344// a.ets(与c.ts在同一目录中) 345import { taskpoolTest1, taskpoolTest2 } from "./c"; 346 347taskpoolTest1(); 348taskpoolTest2(); 349```