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## taskpool.execute 21 22execute(func: Function, ...args: unknown[]): Promise\<unknown> 23 24将待执行的函数放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式不可取消任务。 25 26**系统能力:** SystemCapability.Utils.Lang 27 28**参数:** 29 30| 参数名 | 类型 | 必填 | 说明 | 31| ------ | --------- | ---- | ---------------------------------------------------------------------- | 32| func | Function | 是 | 执行的逻辑需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 33| args | unknown[] | 否 | 执行逻辑的函数所需要的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 34 35**返回值:** 36 37| 类型 | 说明 | 38| ----------------- | ------------------------------------ | 39| Promise\<unknown> | execute是异步方法,返回Promise对象。 | 40 41**错误码:** 42 43以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 44 45| 错误码ID | 错误信息 | 46| -------- | ----------------------------------------- | 47| 10200003 | Worker initialization failure. | 48| 10200006 | Serializing an uncaught exception failed. | 49| 10200014 | The function is not mark as concurrent. | 50 51**示例:** 52 53```ts 54@Concurrent 55function printArgs(args) { 56 console.log("printArgs: " + args); 57 return args; 58} 59 60async function taskpoolExecute() { 61 let value = await taskpool.execute(printArgs, 100); 62 console.log("taskpool result: " + value); 63} 64 65taskpoolExecute(); 66``` 67 68## taskpool.execute 69 70execute(task: Task, priority?: Priority): Promise\<unknown> 71 72将创建好的任务放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式可尝试调用cancel进行任务取消。 73 74**系统能力:** SystemCapability.Utils.Lang 75 76**参数:** 77 78| 参数名 | 类型 | 必填 | 说明 | 79| -------- | --------------------- | ---- | ------------------------------------ | 80| task | [Task](#task) | 是 | 需要在任务池中执行的任务。 | 81| priority | [Priority](#priority) | 否 | 等待执行的任务的优先级(暂未支持)。 | 82 83**返回值:** 84 85| 类型 | 说明 | 86| ---------------- | ------------------------------ | 87| Promise\<unknown> | execute是异步方法,返回Promise对象。 | 88 89**错误码:** 90 91以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 92 93| 错误码ID | 错误信息 | 94| -------- | ----------------------------------------- | 95| 10200003 | Worker initialization failure. | 96| 10200006 | Serializing an uncaught exception failed. | 97| 10200014 | The function is not mark as concurrent. | 98 99**示例:** 100 101```ts 102@Concurrent 103function printArgs(args) { 104 console.log("printArgs: " + args); 105 return args; 106} 107 108async function taskpoolExecute() { 109 let task = new taskpool.Task(printArgs, 100); 110 let value = await taskpool.execute(task); 111 console.log("taskpool result: " + value); 112} 113 114taskpoolExecute(); 115``` 116 117## taskpool.cancel 118 119cancel(task: Task): void 120 121取消任务池中的任务。 122 123**系统能力:** SystemCapability.Utils.Lang 124 125**参数:** 126 127| 参数名 | 类型 | 必填 | 说明 | 128| ------ | ------------- | ---- | -------------------- | 129| task | [Task](#task) | 是 | 需要取消执行的任务。 | 130 131**错误码:** 132 133以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 134 135| 错误码ID | 错误信息 | 136| -------- | ------------------------- | 137| 10200015 | If the task is not exist. | 138| 10200016 | If the task is running. | 139 140**任务取消成功示例:** 141 142```ts 143@Concurrent 144function printArgs(args) { 145 console.log("printArgs: " + args); 146 return args; 147} 148 149async function taskpoolCancel() { 150 let task = new taskpool.Task(printArgs, 100); 151 taskpool.execute(task); 152 try { 153 taskpool.cancel(task); 154 } catch (e) { 155 console.log("taskpool.cancel occur error:" + e); 156 } 157} 158 159taskpoolCancel(); 160``` 161 162**已执行的任务取消失败示例:** 163 164```ts 165@Concurrent 166function printArgs(args) { 167 console.log("printArgs: " + args); 168 return args; 169} 170 171async function taskpoolCancel() { 172 let task = new taskpool.Task(printArgs, 100); 173 let value = taskpool.execute(task); 174 let start = new Date().getTime(); 175 while (new Date().getTime() - start < 1000) { // 延时1s,确保任务已执行 176 continue; 177 } 178 179 try { 180 taskpool.cancel(task); //任务已执行,取消失败 181 } catch (e) { 182 console.log("taskpool.cancel occur error:" + e); 183 } 184} 185 186taskpoolCancel(); 187``` 188 189**正在执行的任务取消失败示例:** 190 191```ts 192@Concurrent 193function printArgs(args) { 194 console.log("printArgs: " + args); 195 return args; 196} 197 198async function taskpoolCancel() { 199 let task1 = new taskpool.Task(printArgs, 100); 200 let task2 = new taskpool.Task(printArgs, 200); 201 let task3 = new taskpool.Task(printArgs, 300); 202 let task4 = new taskpool.Task(printArgs, 400); 203 let task5 = new taskpool.Task(printArgs, 500); 204 let task6 = new taskpool.Task(printArgs, 600); 205 206 let res1 = taskpool.execute(task1); 207 let res2 = taskpool.execute(task2); 208 let res3 = taskpool.execute(task3); 209 let res4 = taskpool.execute(task4); 210 let res5 = taskpool.execute(task5); 211 let res6 = taskpool.execute(task6); 212 try { 213 taskpool.cancel(task1); // task1任务正在执行,取消失败 214 } catch (e) { 215 console.log("taskpool.cancel occur error:" + e); 216 } 217} 218 219taskpoolCancel(); 220``` 221 222## Priority 223 224表示所创建任务(Task)的优先级。(暂未支持) 225 226**系统能力:** SystemCapability.Utils.Lang 227 228| 名称 | 值 | 说明 | 229| -------- | -------- | -------- | 230| HIGH | 0 | 任务为高优先级。 | 231| MEDIUM | 1 | 任务为中优先级。 | 232| LOW | 2 | 任务为低优先级。 | 233 234## Task 235 236表示任务。使用以下方法前,需要先构造Task。 237 238### constructor 239 240constructor(func: Function, ...args: unknown[]) 241 242Task的构造函数。 243 244**系统能力:** SystemCapability.Utils.Lang 245 246**参数:** 247 248| 参数名 | 类型 | 必填 | 说明 | 249| ------ | --------- | ---- | -------------------------------------------------------------------- | 250| func | Function | 是 | 任务执行需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 251| args | unknown[] | 否 | 任务执行传入函数的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 252 253**错误码:** 254 255以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 256 257| 错误码ID | 错误信息 | 258| -------- | --------------------------------------- | 259| 10200014 | The function is not mark as concurrent. | 260 261**示例:** 262 263```ts 264@Concurrent 265function printArgs(args) { 266 console.log("printArgs: " + args); 267 return args; 268} 269 270let task = new taskpool.Task(printArgs, "this is my first Task"); 271``` 272 273### 属性 274 275**系统能力:** SystemCapability.Utils.Lang 276 277| 名称 | 类型 | 可读 | 可写 | 说明 | 278| --------- | --------- | ---- | ---- | ------------------------------------------------------------------------- | 279| function | Function | 是 | 是 | 创建任务时需要传入的函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 280| arguments | unknown[] | 是 | 是 | 创建任务传入函数所需的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。 | 281 282## 其他说明 283 284### 序列化支持类型 285序列化支持类型包括:All Primitive Type(不包括symbol)、Date、String、RegExp、Array、Map、Set、Object、ArrayBuffer、TypedArray。 286 287### 注意事项 288- 仅支持在Stage模型且module的compileMode为esmodule的project中使用taskpool api。确认module的compileMode方法:查看当前module的build-profile.json5,在buildOption中补充"compileMode": "esmodule"。 289- taskpool任务只支持引用入参传递或者import的变量,不支持使用闭包变量,使用装饰器@Concurrent进行拦截。 290- taskpool任务只支持普通函数或者async函数,不支持类成员函数或者匿名函数,使用装饰器@Concurrent进行拦截。 291- 装饰器@Concurrent仅支持在ets文件使用。 292 293### 简单使用 294 295**示例一** 296 297```ts 298// 支持普通函数、引用入参传递 299@Concurrent 300function printArgs(args) { 301 console.log("printArgs: " + args); 302 return args; 303} 304 305async function taskpoolExecute() { 306 // taskpool.execute(task) 307 let task = new taskpool.Task(printArgs, "create task, then execute"); 308 let val1 = await taskpool.execute(task); 309 console.log("taskpool.execute(task) result: " + val1); 310 311 // taskpool.execute(function) 312 let val2 = await taskpool.execute(func, "execute task by func"); 313 console.log("taskpool.execute(function) result: " + val2); 314} 315 316taskpoolExecute(); 317``` 318 319**示例二** 320 321```ts 322// b.ets 323export var c = 2000; 324``` 325```ts 326// 引用import变量 327// a.ets(与b.ets位于同一目录中) 328import { c } from "./b"; 329 330@Concurrent 331function printArgs(a) { 332 console.log(a); 333 console.log(c); 334 return a; 335} 336 337async function taskpoolExecute() { 338 // taskpool.execute(task) 339 let task = new taskpool.Task(printArgs, "create task, then execute"); 340 let val1 = await taskpool.execute(task); 341 console.log("taskpool.execute(task) result: " + val1); 342 343 // taskpool.execute(function) 344 let val2 = await taskpool.execute(printArgs, "execute task by func"); 345 console.log("taskpool.execute(function) result: " + val2); 346} 347 348taskpoolExecute(); 349``` 350 351**示例三** 352 353```ts 354// 支持async函数 355@Concurrent 356async function delayExcute() { 357 let ret = await Promise.all([ 358 new Promise(resolve => setTimeout(resolve, 1000, "resolved")) 359 ]); 360 return ret; 361} 362 363async function taskpoolExecute() { 364 taskpool.execute(delayExcute).then((result) => { 365 console.log("TaskPoolTest task result: " + result); 366 }); 367} 368 369taskpoolExecute(); 370``` 371 372**示例四** 373 374```ts 375// c.ets 376@Concurrent 377function strSort(inPutArr) { 378 let newArr = inPutArr.sort(); 379 return newArr; 380} 381export async function func1() { 382 console.log("taskpoolTest start"); 383 let strArray = ['c test string', 'b test string', 'a test string']; 384 var task = new taskpool.Task(strSort, strArray); 385 var result = await taskpool.execute(task); 386 console.log("func1 result:" + result); 387} 388 389export async function func2() { 390 console.log("taskpoolTest2 start"); 391 let strArray = ['c test string', 'b test string', 'a test string']; 392 taskpool.execute(strSort, strArray).then((result) => { 393 console.log("func2 result: " + result); 394 }); 395} 396``` 397 398```ts 399// a.ets(与c.ets在同一目录中) 400import { taskpoolTest1, taskpoolTest2 } from "./c"; 401 402func1(); 403func2(); 404```