1# @ohos.taskpool(启动任务池) 2 3任务池(taskpool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任务进行如任务执行、任务取消的操作。理论上您可以使用任务池API创建数量不受限制的任务,但是出于内存因素不建议您这样做。此外,不建议您在任务中执行阻塞操作,特别是无限期阻塞操作,长时间的阻塞操作占据工作线程,可能会阻塞其他任务调度,影响您的应用性能。 4 5您所创建的同一优先级任务的执行顺序可以由您决定,任务真实执行的顺序与您调用任务池API提供的任务执行接口顺序一致。任务默认优先级是MEDIUM。 6 7当同一时间待执行的任务数量大于任务池工作线程数量,任务池会根据负载均衡机制进行扩容,增加工作线程数量,减少整体等待时长。同样,当执行的任务数量减少,工作线程数量大于执行任务数量,部分工作线程处于空闲状态,任务池会根据负载均衡机制进行缩容,减少工作线程数量。 8 9任务池API以数字形式返回错误码。有关各个错误码的更多信息,请参阅文档[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 10 11taskpool使用过程中的相关注意点请查[TaskPool注意事项](../../arkts-utils/taskpool-introduction.md#taskpool注意事项)。 12 13> **说明:**<br/> 14> 本模块首批接口从API version 9 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 15 16## 导入模块 17 18```ts 19import taskpool from '@ohos.taskpool'; 20``` 21## taskpool.execute 22 23execute(func: Function, ...args: unknown[]): Promise\<unknown> 24 25将待执行的函数放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式不可取消任务。 26 27**系统能力:** SystemCapability.Utils.Lang 28 29**参数:** 30 31| 参数名 | 类型 | 必填 | 说明 | 32| ------ | --------- | ---- | ---------------------------------------------------------------------- | 33| func | Function | 是 | 执行的逻辑需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 34| args | unknown[] | 否 | 执行逻辑的函数所需要的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 35 36**返回值:** 37 38| 类型 | 说明 | 39| ----------------- | ------------------------------------ | 40| Promise\<unknown> | execute是异步方法,返回Promise对象。 | 41 42**错误码:** 43 44以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 45 46| 错误码ID | 错误信息 | 47| -------- | -------------------------------------------- | 48| 10200003 | Worker initialization failure. | 49| 10200006 | An exception occurred during serialization. | 50| 10200014 | The function is not mark as concurrent. | 51 52**示例:** 53 54```ts 55@Concurrent 56function printArgs(args: number): number { 57 console.log("printArgs: " + args); 58 return args; 59} 60 61taskpool.execute(printArgs, 100).then((value: number) => { // 100: test number 62 console.log("taskpool result: " + value); 63}); 64``` 65 66## taskpool.execute 67 68execute(task: Task, priority?: Priority): Promise\<unknown> 69 70将创建好的任务放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式可尝试调用cancel进行任务取消。 71 72**系统能力:** SystemCapability.Utils.Lang 73 74**参数:** 75 76| 参数名 | 类型 | 必填 | 说明 | 77| -------- | --------------------- | ---- | ---------------------------------------- | 78| task | [Task](#task) | 是 | 需要在任务池中执行的任务。 | 79| priority | [Priority](#priority) | 否 | 等待执行的任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 80 81**返回值:** 82 83| 类型 | 说明 | 84| ---------------- | ---------------- | 85| Promise\<unknown> | 返回Promise对象。 | 86 87**错误码:** 88 89以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 90 91| 错误码ID | 错误信息 | 92| -------- | ------------------------------------------- | 93| 10200003 | Worker initialization failure. | 94| 10200006 | An exception occurred during serialization. | 95| 10200014 | The function is not mark as concurrent. | 96 97**示例:** 98 99```ts 100@Concurrent 101function printArgs(args: number): number { 102 console.log("printArgs: " + args); 103 return args; 104} 105 106let task: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 107taskpool.execute(task).then((value: number) => { 108 console.log("taskpool result: " + value); 109}); 110``` 111 112## taskpool.execute<sup>10+</sup> 113 114execute(group: TaskGroup, priority?: Priority): Promise<unknown[]> 115 116将创建好的任务组放入taskpool内部任务队列等待,等待分发到工作线程执行。 117 118**系统能力:** SystemCapability.Utils.Lang 119 120**参数:** 121 122| 参数名 | 类型 | 必填 | 说明 | 123| --------- | --------------------------- | ---- | -------------------------------------------------------------- | 124| group | [TaskGroup](#taskgroup10) | 是 | 需要在任务池中执行的任务组。 | 125| priority | [Priority](#priority) | 否 | 等待执行的任务组的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 126 127**返回值:** 128 129| 类型 | 说明 | 130| ---------------- | ---------------------------------- | 131| Promise\<unknown[]> | execute是异步方法,返回Promise对象。 | 132 133**错误码:** 134 135以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 136 137| 错误码ID | 错误信息 | 138| -------- | ------------------------------------------- | 139| 10200006 | An exception occurred during serialization. | 140 141**示例:** 142 143```ts 144@Concurrent 145function printArgs(args: number): number { 146 console.log("printArgs: " + args); 147 return args; 148} 149 150let taskGroup1: taskpool.TaskGroup = new taskpool.TaskGroup(); 151taskGroup1.addTask(printArgs, 10); // 10: test number 152taskGroup1.addTask(printArgs, 20); // 20: test number 153taskGroup1.addTask(printArgs, 30); // 30: test number 154 155let taskGroup2: taskpool.TaskGroup = new taskpool.TaskGroup(); 156let task1: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 157let task2: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 158let task3: taskpool.Task = new taskpool.Task(printArgs, 300); // 300: test number 159taskGroup2.addTask(task1); 160taskGroup2.addTask(task2); 161taskGroup2.addTask(task3); 162taskpool.execute(taskGroup1).then((res: Array<number>) => { 163 console.info("taskpool execute res is:" + res); 164}); 165taskpool.execute(taskGroup2).then((res: Array<number>) => { 166 console.info("taskpool execute res is:" + res); 167}); 168``` 169 170## taskpool.cancel 171 172cancel(task: Task): void 173 174取消任务池中的任务。 175 176**系统能力:** SystemCapability.Utils.Lang 177 178**参数:** 179 180| 参数名 | 类型 | 必填 | 说明 | 181| ------ | ------------- | ---- | -------------------- | 182| task | [Task](#task) | 是 | 需要取消执行的任务。 | 183 184**错误码:** 185 186以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 187 188| 错误码ID | 错误信息 | 189| -------- | -------------------------------------------- | 190| 10200015 | The task does not exist when it is canceled. | 191| 10200016 | The task is executing when it is canceled. | 192 193从API version10开始,此接口调用时不再涉及上报错误码10200016。 194 195**正在执行的任务取消示例:** 196 197```ts 198@Concurrent 199function inspectStatus(arg: number): number { 200 // 第一次检查任务是否已经取消并作出响应 201 if (taskpool.Task.isCanceled()) { 202 console.info("task has been canceled before 2s sleep."); 203 return arg + 2; 204 } 205 // 2s sleep 206 let t: number = Date.now(); 207 while (Date.now() - t < 2000) { 208 continue; 209 } 210 // 第二次检查任务是否已经取消并作出响应 211 if (taskpool.Task.isCanceled()) { 212 console.info("task has been canceled after 2s sleep."); 213 return arg + 3; 214 } 215 return arg + 1; 216} 217 218function concurrntFunc() { 219 let task1: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 220 let task2: taskpool.Task = new taskpool.Task(inspectStatus, 200); // 200: test number 221 let task3: taskpool.Task = new taskpool.Task(inspectStatus, 300); // 300: test number 222 let task4: taskpool.Task = new taskpool.Task(inspectStatus, 400); // 400: test number 223 let task5: taskpool.Task = new taskpool.Task(inspectStatus, 500); // 500: test number 224 let task6: taskpool.Task = new taskpool.Task(inspectStatus, 600); // 600: test number 225 taskpool.execute(task1).then((res: Object)=>{ 226 console.info("taskpool test result: " + res); 227 }); 228 taskpool.execute(task2); 229 taskpool.execute(task3); 230 taskpool.execute(task4); 231 taskpool.execute(task5); 232 taskpool.execute(task6); 233 // 1s后取消task 234 setTimeout(()=>{ 235 try { 236 taskpool.cancel(task1); 237 } catch (e) { 238 console.error(`taskpool: cancel error code: ${e.code}, info: ${e.message}`); 239 } 240 }, 1000); 241} 242 243concurrntFunc(); 244``` 245 246## taskpool.cancel<sup>10+</sup> 247 248cancel(group: TaskGroup): void 249 250取消任务池中的任务组。 251 252**系统能力:** SystemCapability.Utils.Lang 253 254**参数:** 255 256| 参数名 | 类型 | 必填 | 说明 | 257| ------- | ----------------------- | ---- | -------------------- | 258| group | [TaskGroup](#taskgroup10) | 是 | 需要取消执行的任务组。 | 259 260**错误码:** 261 262以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 263 264| 错误码ID | 错误信息 | 265| -------- | ------------------------------------------------------- | 266| 10200018 | The task group does not exist when it is canceled. | 267 268**示例:** 269 270```ts 271@Concurrent 272function printArgs(args: number): number { 273 let t: number = Date.now(); 274 while (Date.now() - t < 2000) { 275 continue; 276 } 277 console.info("printArgs: " + args); 278 return args; 279} 280 281function concurrntFunc() { 282 let taskGroup1: taskpool.TaskGroup = new taskpool.TaskGroup(); 283 taskGroup1.addTask(printArgs, 10); // 10: test number 284 let taskGroup2: taskpool.TaskGroup = new taskpool.TaskGroup(); 285 taskGroup2.addTask(printArgs, 100); // 100: test number 286 taskpool.execute(taskGroup1).then((res: Array<Object>)=>{ 287 console.info("taskGroup1 res is:" + res); 288 }); 289 taskpool.execute(taskGroup2).then((res: Array<Object>)=>{ 290 console.info("taskGroup2 res is:" + res); 291 }); 292 setTimeout(()=>{ 293 try { 294 taskpool.cancel(taskGroup2); 295 } catch (e) { 296 console.error(`taskpool: cancel error code: ${e.code}, info: ${e.message}`); 297 } 298 }, 1000); 299} 300 301concurrntFunc(); 302``` 303 304 305## taskpool.getTaskPoolInfo<sup>10+</sup> 306 307getTaskPoolInfo(): TaskPoolInfo 308 309获取任务池内部信息。 310 311**系统能力:** SystemCapability.Utils.Lang 312 313**返回值:** 314 315| 类型 | 说明 | 316| ----------------------------------- | ------------------ | 317| [TaskPoolInfo](#taskpoolinfo10) | 任务池的内部信息。 | 318 319**示例:** 320 321```ts 322let taskpoolInfo: taskpool.TaskPoolInfo = taskpool.getTaskPoolInfo(); 323``` 324 325## Priority 326 327表示所创建任务(Task)的优先级。 328 329**系统能力:** SystemCapability.Utils.Lang 330 331| 名称 | 值 | 说明 | 332| -------- | -------- | -------- | 333| HIGH | 0 | 任务为高优先级。 | 334| MEDIUM | 1 | 任务为中优先级。 | 335| LOW | 2 | 任务为低优先级。 | 336 337**示例:** 338 339```ts 340@Concurrent 341function printArgs(args: number): number { 342 console.log("printArgs: " + args); 343 return args; 344} 345 346let task: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 347let highCount = 0; 348let mediumCount = 0; 349let lowCount = 0; 350let allCount = 100; 351for (let i: number = 0; i < allCount; i++) { 352 taskpool.execute(task, taskpool.Priority.LOW).then((res: number) => { 353 lowCount++; 354 console.log("taskpool lowCount is :" + lowCount); 355 }); 356 taskpool.execute(task, taskpool.Priority.MEDIUM).then((res: number) => { 357 mediumCount++; 358 console.log("taskpool mediumCount is :" + mediumCount); 359 }); 360 taskpool.execute(task, taskpool.Priority.HIGH).then((res: number) => { 361 highCount++; 362 console.log("taskpool highCount is :" + highCount); 363 }); 364} 365``` 366 367## Task 368 369表示任务。使用[constructor](#constructor)方法构造Task。 370 371### constructor 372 373constructor(func: Function, ...args: unknown[]) 374 375Task的构造函数。 376 377**系统能力:** SystemCapability.Utils.Lang 378 379**参数:** 380 381| 参数名 | 类型 | 必填 | 说明 | 382| ------ | --------- | ---- | -------------------------------------------------------------------- | 383| func | Function | 是 | 任务执行需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 384| args | unknown[] | 否 | 任务执行传入函数的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 385 386**错误码:** 387 388以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 389 390| 错误码ID | 错误信息 | 391| -------- | --------------------------------------- | 392| 10200014 | The function is not mark as concurrent. | 393 394**示例:** 395 396```ts 397@Concurrent 398function printArgs(args: number): number { 399 console.log("printArgs: " + args); 400 return args; 401} 402 403let task: taskpool.Task = new taskpool.Task(printArgs, "this is my first Task"); 404``` 405 406### isCanceled<sup>10+</sup> 407 408static isCanceled(): boolean 409 410检查当前正在运行的任务是否已取消。使用该方法前需要先构造Task。 411 412**系统能力:** SystemCapability.Utils.Lang 413 414**返回值:** 415 416| 类型 | 说明 | 417| ------- | ------------------------------------ | 418| boolean | 如果当前正在运行的任务被取消返回true,未被取消返回false。| 419 420**示例:** 421 422```ts 423@Concurrent 424function inspectStatus(arg: number): number { 425 // do something 426 if (taskpool.Task.isCanceled()) { 427 console.log("task has been canceled."); 428 // do something 429 return arg + 1; 430 } 431 // do something 432 return arg; 433} 434``` 435 436> **说明:**<br/> 437> isCanceled方法需要和taskpool.cancel方法搭配使用,如果不调用cancel方法,isCanceled方法默认返回false。 438 439**示例:** 440 441```ts 442@Concurrent 443function inspectStatus(arg: number): number { 444 // 第一时间检查取消并回复 445 if (taskpool.Task.isCanceled()) { 446 console.log("task has been canceled before 2s sleep."); 447 return arg + 2; 448 } 449 // 延时2s 450 let t: number = Date.now(); 451 while (Date.now() - t < 2000) { 452 continue; 453 } 454 // 第二次检查取消并作出响应 455 if (taskpool.Task.isCanceled()) { 456 console.log("task has been canceled after 2s sleep."); 457 return arg + 3; 458 } 459 return arg + 1; 460} 461 462let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 463taskpool.execute(task).then((res: number)=>{ 464 console.log("taskpool test result: " + res); 465}).catch((err: string) => { 466 console.log("taskpool test occur error: " + err); 467}); 468// 不调用cancel,isCanceled()默认返回false,task执行的结果为101 469``` 470 471### setTransferList<sup>10+</sup> 472 473setTransferList(transfer?: ArrayBuffer[]): void 474 475设置任务的传输列表。使用该方法前需要先构造Task。 476 477> **说明:**<br/> 478> 此接口可以设置任务池中ArrayBuffer的transfer列表,transfer列表中的ArrayBuffer对象在传输时不会复制buffer内容到工作线程而是转移buffer控制权至工作线程,传输后当前的ArrayBuffer失效。若ArrayBuffer为空,则不会transfer转移。 479 480**系统能力:** SystemCapability.Utils.Lang 481 482**参数:** 483 484| 参数名 | 类型 | 必填 | 说明 | 485| -------- | ------------- | ---- | --------------------------------------------- | 486| transfer | ArrayBuffer[] | 否 | 可传输对象是ArrayBuffer的实例对象,默认为空数组。 | 487 488**示例:** 489 490```ts 491let buffer: ArrayBuffer = new ArrayBuffer(8); 492let view: Uint8Array = new Uint8Array(buffer); 493let buffer1: ArrayBuffer = new ArrayBuffer(16); 494let view1: Uint8Array = new Uint8Array(buffer1); 495 496console.info("testTransfer view byteLength: " + view.byteLength); 497console.info("testTransfer view1 byteLength: " + view1.byteLength); 498@Concurrent 499function testTransfer(arg1: ArrayBuffer, arg2: ArrayBuffer): number { 500 console.info("testTransfer arg1 byteLength: " + arg1.byteLength); 501 console.info("testTransfer arg2 byteLength: " + arg2.byteLength); 502 return 100; 503} 504let task: taskpool.Task = new taskpool.Task(testTransfer, view, view1); 505task.setTransferList([view.buffer, view1.buffer]); 506taskpool.execute(task).then((res: number)=>{ 507 console.info("test result: " + res); 508}).catch((e: string)=>{ 509 console.error("test catch: " + e); 510}) 511console.info("testTransfer view byteLength: " + view.byteLength); 512console.info("testTransfer view1 byteLength: " + view1.byteLength); 513``` 514 515### 属性 516 517**系统能力:** SystemCapability.Utils.Lang 518 519| 名称 | 类型 | 可读 | 可写 | 说明 | 520| --------- | --------- | ---- | ---- | ------------------------------------------------------------------------- | 521| function | Function | 是 | 是 | 创建任务时需要传入的函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 522| arguments | unknown[] | 是 | 是 | 创建任务传入函数所需的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。 | 523 524## TaskGroup<sup>10+</sup> 525 526表示任务组,一次执行一组任务,如果所有任务正常执行,异步执行完毕后返回所有任务结果的数组,数组中元素的顺序与[addTask](#addtask10-1)的顺序相同;如果任意任务失败,则会抛出对应异常。任务组可以多次执行,但执行后不能新增任务。使用[constructor](#constructor10)方法构造TaskGroup。 527 528### constructor<sup>10+</sup> 529 530constructor() 531 532TaskGroup的构造函数。 533 534**系统能力:** SystemCapability.Utils.Lang 535 536**示例:** 537 538```ts 539let taskGroup = new taskpool.TaskGroup(); 540``` 541 542### addTask<sup>10+</sup> 543 544addTask(func: Function, ...args: unknown[]): void 545 546将待执行的函数添加到任务组中。使用该方法前需要先构造TaskGroup。 547 548**系统能力:** SystemCapability.Utils.Lang 549 550**参数:** 551 552| 参数名 | 类型 | 必填 | 说明 | 553| ------ | --------- | ---- | ---------------------------------------------------------------------- | 554| func | Function | 是 | 任务执行需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 555| args | unknown[] | 否 | 任务执行函数所需要的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 556 557**错误码:** 558 559以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 560 561| 错误码ID | 错误信息 | 562| -------- | --------------------------------------- | 563| 10200014 | The function is not mark as concurrent. | 564 565**示例:** 566 567```ts 568@Concurrent 569function printArgs(args: number): number { 570 console.log("printArgs: " + args); 571 return args; 572} 573 574let taskGroup: taskpool.TaskGroup = new taskpool.TaskGroup(); 575taskGroup.addTask(printArgs, 100); // 100: test number 576``` 577 578### addTask<sup>10+</sup> 579 580addTask(task: Task): void 581 582将创建好的任务添加到任务组中。使用该方法前需要先构造TaskGroup。 583 584**系统能力:** SystemCapability.Utils.Lang 585 586**参数:** 587 588| 参数名 | 类型 | 必填 | 说明 | 589| -------- | --------------------- | ---- | ---------------------------------------- | 590| task | [Task](#task) | 是 | 需要添加到任务组中的任务。 | 591 592**错误码:** 593 594以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 595 596| 错误码ID | 错误信息 | 597| -------- | --------------------------------------- | 598| 10200014 | The function is not mark as concurrent. | 599 600**示例:** 601 602```ts 603@Concurrent 604function printArgs(args: number): number { 605 console.log("printArgs: " + args); 606 return args; 607} 608 609let taskGroup: taskpool.TaskGroup = new taskpool.TaskGroup(); 610let task: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 611taskGroup.addTask(task); 612``` 613 614 615## State<sup>10+</sup> 616 617表示任务(Task)状态的枚举。 618 619**系统能力:** SystemCapability.Utils.Lang 620 621| 名称 | 值 | 说明 | 622| --------- | -------- | ------------- | 623| WAITING | 1 | 任务正在等待。 | 624| RUNNING | 2 | 任务正在执行。 | 625| CANCELED | 3 | 任务已被取消。 | 626 627 628## TaskInfo<sup>10+</sup> 629 630任务的内部信息。 631 632**系统能力:** SystemCapability.Utils.Lang 633 634### 属性 635 636**系统能力:** SystemCapability.Utils.Lang 637 638| 名称 | 类型 | 可读 | 可写 | 说明 | 639| -------- | ------------------ | ---- | ---- | ------------------------------------------------------------- | 640| taskId | number | 是 | 否 | 任务的ID。 | 641| state | [State](#state10) | 是 | 否 | 任务的状态。 | 642| duration | number | 是 | 否 | 任务执行至当前所用的时间,单位为ms。当返回为0时,表示任务未执行;返回为空时,表示没有任务执行。 | 643 644## ThreadInfo<sup>10+</sup> 645 646工作线程的内部信息。 647 648**系统能力:** SystemCapability.Utils.Lang 649 650### 属性 651 652**系统能力:** SystemCapability.Utils.Lang 653 654| 名称 | 类型 | 可读 | 可写 | 说明 | 655| -------- | ---------------------- | ---- | ---- | -------------------------------------------------------- | 656| tid | number | 是 | 否 | 工作线程的标识符。返回为空时,代表没有任务执行。 | 657| taskIds | number[] | 是 | 否 | 在当前线程上运行的任务id列表。返回为空时,代表没有任务执行。 | 658| priority | [Priority](#priority) | 是 | 否 | 当前线程的优先级。返回为空时,代表没有任务执行。 | 659 660## TaskPoolInfo<sup>10+</sup> 661 662任务池的内部信息。 663 664**系统能力:** SystemCapability.Utils.Lang 665 666### 属性 667 668**系统能力:** SystemCapability.Utils.Lang 669 670| 名称 | 类型 | 可读 | 可写 | 说明 | 671| ------------- | -------------------------------- | ---- | ---- | -------------------- | 672| threadInfos | [ThreadInfo[]](#threadinfo10) | 是 | 否 | 工作线程的内部信息。 | 673| taskInfos | [TaskInfo[]](#taskinfo10) | 是 | 否 | 任务的内部信息。 | 674 675 676## 其他说明 677 678### 序列化支持类型 679序列化支持类型包括:All Primitive Type(不包括symbol)、Date、String、RegExp、Array、Map、Set、Object、ArrayBuffer、TypedArray。 680 681### 简单使用 682 683**示例一** 684 685```ts 686// 支持普通函数、引用入参传递 687@Concurrent 688function printArgs(args: string): string { 689 console.log("func: " + args); 690 return args; 691} 692async function taskpoolExecute(): Promise<void> { 693 // taskpool.execute(task) 694 let task: taskpool.Task = new taskpool.Task(printArgs, "create task, then execute"); 695 console.log("taskpool.execute(task) result: " + await taskpool.execute(task)); 696 // taskpool.execute(function) 697 console.log("taskpool.execute(function) result: " + await taskpool.execute(printArgs, "execute task by func")); 698} 699taskpoolExecute(); 700``` 701 702**示例二** 703 704```ts 705// b.ets 706export let c: string = "hello"; 707``` 708```ts 709// 引用import变量 710// a.ets(与b.ets位于同一目录中) 711import { c } from "./b"; 712 713@Concurrent 714function printArgs(a: string): string { 715 console.log(a); 716 console.log(c); 717 return a; 718} 719 720async function taskpoolExecute(): Promise<void> { 721 // taskpool.execute(task) 722 let task: taskpool.Task = new taskpool.Task(printArgs, "create task, then execute"); 723 console.log("taskpool.execute(task) result: " + await taskpool.execute(task)); 724 725 // taskpool.execute(function) 726 console.log("taskpool.execute(function) result: " + await taskpool.execute(printArgs, "execute task by func")); 727} 728 729taskpoolExecute(); 730``` 731 732**示例三** 733 734```ts 735// 支持async函数 736@Concurrent 737async function delayExcute(): Promise<Object> { 738 let ret = await Promise.all<Object>([ 739 new Promise<Object>(resolve => setTimeout(resolve, 1000, "resolved")) 740 ]); 741 return ret; 742} 743 744async function taskpoolExecute(): Promise<void> { 745 taskpool.execute(delayExcute).then((result: string) => { 746 console.log("taskPoolTest task result: " + result); 747 }).catch((err: string) => { 748 console.log("taskpool test occur error: " + err); 749 }); 750} 751 752taskpoolExecute(); 753``` 754 755**示例四** 756 757```ts 758// c.ets 759@Concurrent 760function strSort(inPutArr: Array<string>): Array<string> { 761 let newArr = inPutArr.sort(); 762 return newArr; 763} 764export async function func1(): Promise<void> { 765 console.log("taskpoolTest start"); 766 let strArray: Array<string> = ['c test string', 'b test string', 'a test string']; 767 let task: taskpool.Task = new taskpool.Task(strSort, strArray); 768 console.log("func1 result:" + await taskpool.execute(task)); 769} 770 771export async function func2(): Promise<void> { 772 console.log("taskpoolTest2 start"); 773 let strArray: Array<string> = ['c test string', 'b test string', 'a test string']; 774 taskpool.execute(strSort, strArray).then((result: Array<string>) => { 775 console.log("func2 result: " + result); 776 }).catch((err: string) => { 777 console.log("taskpool test occur error: " + err); 778 }); 779} 780``` 781 782```ts 783// a.ets(与c.ets在同一目录中) 784import { func1, func2 } from "./c"; 785 786func1(); 787func2(); 788``` 789 790**示例五** 791 792```ts 793// 任务取消成功 794@Concurrent 795function inspectStatus(arg: number): number { 796 // 第一次检查任务是否已经取消并作出响应 797 if (taskpool.Task.isCanceled()) { 798 console.info("task has been canceled before 2s sleep."); 799 return arg + 2; 800 } 801 // 2s sleep 802 let t: number = Date.now(); 803 while (Date.now() - t < 2000) { 804 continue; 805 } 806 // 第二次检查任务是否已经取消并作出响应 807 if (taskpool.Task.isCanceled()) { 808 console.info("task has been canceled after 2s sleep."); 809 return arg + 3; 810 } 811 return arg + 1; 812} 813 814async function taskpoolCancel(): Promise<void> { 815 let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 816 taskpool.execute(task).then((res: Object)=>{ 817 console.info("taskpool test result: " + res); 818 }).catch((err: string) => { 819 console.error("taskpool test occur error: " + err); 820 }); 821 // 1s后取消task 822 setTimeout(()=>{ 823 try { 824 taskpool.cancel(task); 825 } catch (e) { 826 console.error(`taskpool: cancel error code: ${e.code}, info: ${e.message}`); 827 } 828 }, 1000); 829} 830 831taskpoolCancel(); 832``` 833 834**示例六** 835 836```ts 837// 已执行的任务取消失败 838@Concurrent 839function inspectStatus(arg: number): number { 840 // 第一次检查任务是否已经取消并作出响应 841 if (taskpool.Task.isCanceled()) { 842 return arg + 2; 843 } 844 // 延时2s 845 let t: number = Date.now(); 846 while (Date.now() - t < 500) { 847 continue; 848 } 849 // 第二次检查任务是否已经取消并作出响应 850 if (taskpool.Task.isCanceled()) { 851 return arg + 3; 852 } 853 return arg + 1; 854} 855 856async function taskpoolCancel(): Promise<void> { 857 let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 858 taskpool.execute(task).then((res: Object)=>{ 859 console.info("taskpool test result: " + res); 860 }).catch((err: string) => { 861 console.error("taskpool test occur error: " + err); 862 }); 863 864 setTimeout(()=>{ 865 try { 866 taskpool.cancel(task); // 任务已执行,取消失败 867 } catch (e) { 868 console.error(`taskpool: cancel error code: ${e.code}, info: ${e.message}`); 869 } 870 }, 3000); // 延时3s,确保任务已执行 871} 872 873taskpoolCancel(); 874``` 875 876**示例七** 877 878```ts 879// 待执行的任务组取消成功 880@Concurrent 881function printArgs(args: number): number { 882 let t: number = Date.now(); 883 while (Date.now() - t < 1000) { 884 continue; 885 } 886 console.log("printArgs: " + args); 887 return args; 888} 889 890async function taskpoolGroupCancelTest(): Promise<void> { 891 let taskGroup1: taskpool.TaskGroup = new taskpool.TaskGroup(); 892 taskGroup1.addTask(printArgs, 10); // 10: test number 893 taskGroup1.addTask(printArgs, 20); // 20: test number 894 taskGroup1.addTask(printArgs, 30); // 30: test number 895 let taskGroup2: taskpool.TaskGroup = new taskpool.TaskGroup(); 896 let task1: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 897 let task2: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 898 let task3: taskpool.Task = new taskpool.Task(printArgs, 300); // 300: test number 899 taskGroup2.addTask(task1); 900 taskGroup2.addTask(task2); 901 taskGroup2.addTask(task3); 902 taskpool.execute(taskGroup1).then((res: Array<number>) => { 903 console.info("taskpool execute res is:" + res); 904 }).catch((e: string) => { 905 console.error("taskpool execute error is:" + e); 906 }); 907 taskpool.execute(taskGroup2).then((res: Array<number>) => { 908 console.info("taskpool execute res is:" + res); 909 }).catch((e: string) => { 910 console.error("taskpool execute error is:" + e); 911 }); 912 913 taskpool.cancel(taskGroup2); 914} 915 916taskpoolGroupCancelTest() 917``` 918 919**示例八** 920 921```ts 922// 分别创建执行100个高、中、低优先级的任务,查看其各项信息 923@Concurrent 924function delay(): void { 925 let start: number = new Date().getTime(); 926 while (new Date().getTime() - start < 500) { 927 continue; 928 } 929} 930 931let highCount: number = 0; 932let mediumCount: number = 0; 933let lowCount: number = 0; 934let allCount: number = 100; 935for (let i = 0; i < allCount; i++) { 936 let task1: taskpool.Task = new taskpool.Task(delay); 937 let task2: taskpool.Task = new taskpool.Task(delay); 938 let task3: taskpool.Task = new taskpool.Task(delay); 939 taskpool.execute(task1, taskpool.Priority.LOW).then(() => { 940 lowCount++; 941 }).catch((e: string) => { 942 console.error("low task error: " + e); 943 }) 944 taskpool.execute(task2, taskpool.Priority.MEDIUM).then(() => { 945 mediumCount++; 946 }).catch((e: string) => { 947 console.error("medium task error: " + e); 948 }) 949 taskpool.execute(task3, taskpool.Priority.HIGH).then(() => { 950 highCount++; 951 }).catch((e: string) => { 952 console.error("high task error: " + e); 953 }) 954} 955let start: number = new Date().getTime(); 956while (new Date().getTime() - start < 1000) { 957 continue; 958} 959let taskpoolInfo: taskpool.TaskPoolInfo = taskpool.getTaskPoolInfo(); 960let tid: number = 0; 961let taskIds: Array<number> = []; 962let priority: number = 0; 963let taskId: number = 0; 964let state: number = 0; 965let duration: number = 0; 966let threadIS = Array.from(taskpoolInfo.threadInfos) 967for(let threadInfo of threadIS) { 968 tid = threadInfo.tid; 969 if (threadInfo.taskIds != undefined && threadInfo.priority != undefined ) 970 { 971 taskIds.length = threadInfo.taskIds.length; 972 priority = threadInfo.priority; 973 } 974 console.info("taskpool---tid is:" + tid + ", taskIds is:" + taskIds + ", priority is:" + priority); 975} 976let taskIS = Array.from(taskpoolInfo.taskInfos) 977for(let taskInfo of taskIS) { 978 taskId = taskInfo.taskId; 979 state = taskInfo.state; 980 if (taskInfo.duration != undefined ) 981 { 982 duration = taskInfo.duration; 983 } 984 console.info("taskpool---taskId is:" + taskId + ", state is:" + state + ", duration is:" + duration); 985} 986```