js-apis-taskpool.md 25.7 KB
Newer Older
1
# @ohos.taskpool(启动任务池)
W
wangzhaoyong 已提交
2

W
wangzhaoyong 已提交
3 4
任务池(taskpool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任务进行如任务执行、任务取消的操作。理论上您可以使用任务池API创建数量不受限制的任务,但是出于内存因素不建议您这样做。此外,不建议您在任务中执行阻塞操作,特别是无限期阻塞操作,长时间的阻塞操作占据工作线程,可能会阻塞其他任务调度,影响您的应用性能。

B
buzhuyu 已提交
5
您所创建的同一优先级任务的执行顺序可以由您决定,任务真实执行的顺序与您调用任务池API提供的任务执行接口顺序一致。任务默认优先级是MEDIUM。
W
wangzhaoyong 已提交
6

B
buzhuyu 已提交
7
当同一时间待执行的任务数量大于任务池工作线程数量,任务池会根据负载均衡机制进行扩容,增加工作线程数量,减少整体等待时长。同样,当执行的任务数量减少,工作线程数量大于执行任务数量,部分工作线程处于空闲状态,任务池会根据负载均衡机制进行缩容,减少工作线程数量。
W
wangzhaoyong 已提交
8 9

任务池API以数字形式返回错误码。有关各个错误码的更多信息,请参阅文档[语言基础类库错误码](../errorcodes/errorcode-utils.md)
W
wangzhaoyong 已提交
10

W
wangzhaoyong 已提交
11 12 13
> **说明:**<br/>
> 本模块首批接口从API version 9 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

W
wangzhaoyong 已提交
14 15
## 导入模块

W
wangzhaoyong 已提交
16
```ts
W
wangzhaoyong 已提交
17 18 19
import taskpool from '@ohos.taskpool';
```

W
wangzhaoyong 已提交
20
## Priority
W
wangzhaoyong 已提交
21

B
buzhuyu 已提交
22
表示所创建任务(Task)的优先级。
W
wangzhaoyong 已提交
23

W
wangzhaoyong 已提交
24
**系统能力:**  SystemCapability.Utils.Lang
W
wangzhaoyong 已提交
25

W
wangzhaoyong 已提交
26 27 28 29 30
| 名称 | 值 | 说明 |
| -------- | -------- | -------- |
| HIGH   | 0    | 任务为高优先级。 |
| MEDIUM | 1 | 任务为中优先级。 |
| LOW | 2 | 任务为低优先级。 |
W
wangzhaoyong 已提交
31

B
buzhuyu 已提交
32 33 34
**示例:**

```ts
B
buzhuyu 已提交
35 36 37
@Concurrent
function printArgs(args) {
    console.log("printArgs: " + args);
B
buzhuyu 已提交
38 39
    return args;
}
B
buzhuyu 已提交
40

B
buzhuyu 已提交
41
let task = new taskpool.Task(printArgs, 100); // 100: test number
B
buzhuyu 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
let highCount = 0;
let mediumCount = 0;
let lowCount = 0;
let allCount = 100;
for (let i = 0; i < allCount; i++) {
  taskpool.execute(task, taskpool.Priority.LOW).then((res: number) => {
    lowCount++;
    console.log("taskpool lowCount is :" + lowCount);
  }).catch((e) => {
    console.error("low task error: " + e);
  })
  taskpool.execute(task, taskpool.Priority.MEDIUM).then((res: number) => {
    mediumCount++;
    console.log("taskpool mediumCount is :" + mediumCount);
  }).catch((e) => {
    console.error("medium task error: " + e);
  })
  taskpool.execute(task, taskpool.Priority.HIGH).then((res: number) => {
    highCount++;
    console.log("taskpool highCount is :" + highCount);
  }).catch((e) => {
    console.error("high task error: " + e);
  })
B
buzhuyu 已提交
65 66 67
}
```

W
wangzhaoyong 已提交
68
## Task
W
wangzhaoyong 已提交
69

W
wangzhaoyong 已提交
70
表示任务。使用以下方法前,需要先构造Task。
W
wangzhaoyong 已提交
71 72 73 74 75

### constructor

constructor(func: Function, ...args: unknown[])

W
wangzhaoyong 已提交
76
Task的构造函数。
W
wangzhaoyong 已提交
77 78 79 80 81

**系统能力:** SystemCapability.Utils.Lang

**参数:**

W
wangzhaoyong 已提交
82 83 84
| 参数名 | 类型      | 必填 | 说明                                                                  |
| ------ | --------- | ---- | -------------------------------------------------------------------- |
| func   | Function  | 是   | 任务执行需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。   |
B
buzhuyu 已提交
85
| args   | unknown[] | 否   | 任务执行传入函数的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 |
W
wangzhaoyong 已提交
86 87 88

**错误码:**

W
wangzhaoyong 已提交
89 90
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

B
buzhuyu 已提交
91
| 错误码ID | 错误信息                                 |
W
wangzhaoyong 已提交
92
| -------- | --------------------------------------- |
W
wangzhaoyong 已提交
93
| 10200014 | The function is not mark as concurrent. |
W
wangzhaoyong 已提交
94 95 96

**示例:**

W
wangzhaoyong 已提交
97 98
```ts
@Concurrent
B
buzhuyu 已提交
99 100
function printArgs(args) {
    console.log("printArgs: " + args);
W
wangzhaoyong 已提交
101 102
    return args;
}
103

B
buzhuyu 已提交
104
let task = new taskpool.Task(printArgs, "this is my first Task");
W
wangzhaoyong 已提交
105 106
```

B
buzhuyu 已提交
107
### isCanceled<sup>10+</sup>
B
buzhuyu 已提交
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150

static isCanceled(): boolean

检查当前正在运行的任务是否已取消。

**系统能力:** SystemCapability.Utils.Lang

**返回值:**

| 类型    | 说明                                 |
| ------- | ------------------------------------ |
| boolean | 如果当前正在运行的任务被取消返回true,未被取消返回false。|

**示例:**

```ts
@Concurrent
function inspectStatus(arg) {
    // do something
    if (taskpool.Task.isCanceled()) {
      console.log("task has been canceled.");
      // do something
      return arg + 1;
    }
    // do something
    return arg;
}
```

> **说明:**<br/>
> isCanceled方法需要和taskpool.cancel方法搭配使用,如果不调用cancel方法,isCanceled方法默认返回false。

**示例:**

```ts
@Concurrent
function inspectStatus(arg) {
    // 第一时间检查取消并回复
    if (taskpool.Task.isCanceled()) {
      console.log("task has been canceled before 2s sleep.");
      return arg + 2;
    }
    // 延时2s
B
buzhuyu 已提交
151
    let t = Date.now();
B
buzhuyu 已提交
152 153 154 155 156 157 158 159 160 161 162
    while (Date.now() - t < 2000) {
      continue;
    }
    // 第二次检查取消并作出响应
    if (taskpool.Task.isCanceled()) {
      console.log("task has been canceled after 2s sleep.");
      return arg + 3;
    }
  return arg + 1;
}

B
buzhuyu 已提交
163
let task = new taskpool.Task(inspectStatus, 100); // 100: test number
B
buzhuyu 已提交
164 165 166 167 168 169 170 171
taskpool.execute(task).then((res)=>{
  console.log("taskpool test result: " + res);
}).catch((err) => {
  console.log("taskpool test occur error: " + err);
});
// 不调用cancel,isCanceled()默认返回false,task执行的结果为101
```

B
buzhuyu 已提交
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
### setTransferList<sup>10+</sup>

setTransferList(transfer?: ArrayBuffer[]): void

设置任务的传输列表。

> **说明:**<br/>
> 此接口可以设置任务池中ArrayBuffer的transfer列表,transfer列表中的ArrayBuffer对象在传输时不会复制buffer内容到工作线程而是转移buffer控制权至工作线程,传输后当前的ArrayBuffer失效。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型           | 必填 | 说明                                          |
| -------- | ------------- | ---- | --------------------------------------------- |
| transfer | ArrayBuffer[] | 否   | 可传输对象是ArrayBuffer的实例对象,默认为空数组。 |

**示例:**

```ts
let buffer = new ArrayBuffer(8);
let view = new Uint8Array(buffer);
let buffer1 = new ArrayBuffer(16);
let view1 = new Uint8Array(buffer1);

console.info("testTransfer view byteLength: " + view.byteLength);
console.info("testTransfer view1 byteLength: " + view1.byteLength);
@Concurrent
function testTransfer(arg1, arg2) {
  console.info("testTransfer arg1 byteLength: " + arg1.byteLength);
  console.info("testTransfer arg2 byteLength: " + arg2.byteLength);
  return 100;
}
let task = new taskpool.Task(testTransfer, view, view1);
task.setTransferList([view.buffer, view1.buffer]);
taskpool.execute(task).then((res)=>{
  console.info("test result: " + res);
}).catch((e)=>{
  console.error("test catch: " + e);
})
console.info("testTransfer view byteLength: " + view.byteLength);
console.info("testTransfer view1 byteLength: " + view1.byteLength);
```

W
wangzhaoyong 已提交
216 217 218 219
### 属性

**系统能力:** SystemCapability.Utils.Lang

W
wangzhaoyong 已提交
220 221 222 223
| 名称      | 类型      | 可读 | 可写 | 说明                                                                       |
| --------- | --------- | ---- | ---- | ------------------------------------------------------------------------- |
| function  | Function  | 是   | 是   | 创建任务时需要传入的函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。   |
| arguments | unknown[] | 是   | 是   | 创建任务传入函数所需的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。 |
W
wangzhaoyong 已提交
224

B
buzhuyu 已提交
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
## TaskGroup<sup>10+</sup>
表示任务组。使用以下方法前,需要先构造TaskGroup。

### constructor<sup>10+</sup>

constructor()

TaskGroup的构造函数。

**系统能力:** SystemCapability.Utils.Lang

**示例:**

```ts
let taskGroup = new taskpool.TaskGroup();
```

### addTask<sup>10+</sup>

addTask(func: Function, ...args: unknown[]): void

将待执行的函数添加到任务组中。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名 | 类型      | 必填 | 说明                                                                   |
| ------ | --------- | ---- | ---------------------------------------------------------------------- |
| func   | Function  | 是   | 任务执行需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。     |
| args   | unknown[] | 否   | 任务执行函数所需要的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                 |
| -------- | --------------------------------------- |
| 10200014 | The function is not mark as concurrent. |

**示例:**

```ts
@Concurrent
function printArgs(args) {
    console.log("printArgs: " + args);
    return args;
}

let taskGroup = new taskpool.TaskGroup();
taskGroup.addTask(printArgs, 100); // 100: test number
```

### addTask<sup>10+</sup>

addTask(task: Task): void

将创建好的任务添加到任务组中。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型                  | 必填 | 说明                                       |
| -------- | --------------------- | ---- | ---------------------------------------- |
| task     | [Task](#task)         | 是   | 需要添加到任务组中的任务。                  |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                 |
| -------- | --------------------------------------- |
| 10200014 | The function is not mark as concurrent. |

**示例:**

```ts
@Concurrent
function printArgs(args) {
    console.log("printArgs: " + args);
    return args;
}

let taskGroup = new taskpool.TaskGroup();
let task = new taskpool.Task(printArgs, 200); // 200: test number
taskGroup.addTask(task);
```

W
wangzhaoyong 已提交
314
## taskpool.execute
W
wangzhaoyong 已提交
315

W
wangzhaoyong 已提交
316
execute(func: Function, ...args: unknown[]): Promise\<unknown>
W
wangzhaoyong 已提交
317

B
buzhuyu 已提交
318
将待执行的函数放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式不可取消任务。
W
wangzhaoyong 已提交
319 320 321 322 323

**系统能力:** SystemCapability.Utils.Lang

**参数:**

W
wangzhaoyong 已提交
324 325 326
| 参数名 | 类型      | 必填 | 说明                                                                   |
| ------ | --------- | ---- | ---------------------------------------------------------------------- |
| func   | Function  | 是   | 执行的逻辑需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。     |
B
buzhuyu 已提交
327
| args   | unknown[] | 否   | 执行逻辑的函数所需要的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 |
W
wangzhaoyong 已提交
328 329 330

**返回值:**

W
wangzhaoyong 已提交
331 332 333
| 类型              | 说明                                 |
| ----------------- | ------------------------------------ |
| Promise\<unknown> | execute是异步方法,返回Promise对象。 |
W
wangzhaoyong 已提交
334 335 336

**错误码:**

W
wangzhaoyong 已提交
337 338
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

B
buzhuyu 已提交
339 340 341 342 343
| 错误码ID | 错误信息                                      |
| -------- | -------------------------------------------- |
| 10200003 | Worker initialization failure.               |
| 10200006 | An exception occurred during serialization.  |
| 10200014 | The function is not mark as concurrent.      |
W
wangzhaoyong 已提交
344 345 346

**示例:**

W
wangzhaoyong 已提交
347 348
```ts
@Concurrent
B
buzhuyu 已提交
349 350
function printArgs(args) {
    console.log("printArgs: " + args);
W
wangzhaoyong 已提交
351 352
    return args;
}
W
wangzhaoyong 已提交
353

B
buzhuyu 已提交
354
taskpool.execute(printArgs, 100).then((value) => { // 100: test number
355
  console.log("taskpool result: " + value);
B
buzhuyu 已提交
356
});
W
wangzhaoyong 已提交
357 358
```

W
wangzhaoyong 已提交
359
## taskpool.execute
W
wangzhaoyong 已提交
360

W
wangzhaoyong 已提交
361
execute(task: Task, priority?: Priority): Promise\<unknown>
W
wangzhaoyong 已提交
362

B
buzhuyu 已提交
363
将创建好的任务放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式可尝试调用cancel进行任务取消。
W
wangzhaoyong 已提交
364 365 366 367 368

**系统能力:** SystemCapability.Utils.Lang

**参数:**

B
buzhuyu 已提交
369 370 371
| 参数名   | 类型                  | 必填 | 说明                                       |
| -------- | --------------------- | ---- | ---------------------------------------- |
| task     | [Task](#task)         | 是   | 需要在任务池中执行的任务。                  |
B
buzhuyu 已提交
372
| priority | [Priority](#priority) | 否   | 等待执行的任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 |
W
wangzhaoyong 已提交
373 374 375

**返回值:**

B
buzhuyu 已提交
376 377 378
| 类型              | 说明              |
| ----------------  | ---------------- |
| Promise\<unknown> | 返回Promise对象。 |
W
wangzhaoyong 已提交
379 380 381

**错误码:**

W
wangzhaoyong 已提交
382 383
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

B
buzhuyu 已提交
384 385 386
| 错误码ID | 错误信息                                     |
| -------- | ------------------------------------------- |
| 10200003 | Worker initialization failure.              |
B
buzhuyu 已提交
387
| 10200006 | An exception occurred during serialization. |
B
buzhuyu 已提交
388
| 10200014 | The function is not mark as concurrent.     |
W
wangzhaoyong 已提交
389 390 391

**示例:**

W
wangzhaoyong 已提交
392 393
```ts
@Concurrent
B
buzhuyu 已提交
394 395
function printArgs(args) {
    console.log("printArgs: " + args);
W
wangzhaoyong 已提交
396 397
    return args;
}
398

B
buzhuyu 已提交
399
let task = new taskpool.Task(printArgs, 100); // 100: test number
B
buzhuyu 已提交
400
taskpool.execute(task).then((value) => {
401
  console.log("taskpool result: " + value);
B
buzhuyu 已提交
402
});
W
wangzhaoyong 已提交
403 404
```

B
buzhuyu 已提交
405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
## taskpool.execute<sup>10+</sup>

execute(group: TaskGroup, priority?: Priority): Promise<unknown[]>

将创建好的任务组放入taskpool内部任务队列等待,等待分发到工作线程执行。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名     | 类型                        | 必填 | 说明                                                           |
| --------- | --------------------------- | ---- | -------------------------------------------------------------- |
| group     | [TaskGroup](#taskgroup)     | 是   | 需要在任务池中执行的任务组。                                      |
| priority  | [Priority](#priority)       | 否   | 等待执行的任务组的优先级,该参数默认值为taskpool.Priority.MEDIUM。 |

**返回值:**

| 类型                 | 说明                               |
| ----------------    | ---------------------------------- |
| Promise\<unknown[]> | execute是异步方法,返回Promise对象。 |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                     |
| -------- | ------------------------------------------- |
| 10200006 | An exception occurred during serialization. |

**示例:**

```ts
@Concurrent
function printArgs(args) {
    console.log("printArgs: " + args);
    return args;
}

let taskGroup1 = new taskpool.TaskGroup();
taskGroup1.addTask(printArgs, 10); // 10: test number
taskGroup1.addTask(printArgs, 20); // 20: test number
taskGroup1.addTask(printArgs, 30); // 30: test number

let taskGroup2 = new taskpool.TaskGroup();
let task1 = new taskpool.Task(printArgs, 100); // 100: test number
let task2 = new taskpool.Task(printArgs, 200); // 200: test number
let task3 = new taskpool.Task(printArgs, 300); // 300: test number
taskGroup2.addTask(task1);
taskGroup2.addTask(task2);
taskGroup2.addTask(task3);
taskpool.execute(taskGroup1).then((res) => {
  console.info("taskpool execute res is:" + res);
}).catch((e) => {
  console.error("taskpool execute error is:" + e);
});
taskpool.execute(taskGroup2).then((res) => {
  console.info("taskpool execute res is:" + res);
}).catch((e) => {
  console.error("taskpool execute error is:" + e);
});
```

W
wangzhaoyong 已提交
467
## taskpool.cancel
W
wangzhaoyong 已提交
468 469 470

cancel(task: Task): void

W
wangzhaoyong 已提交
471 472
取消任务池中的任务。

W
wangzhaoyong 已提交
473 474 475 476
**系统能力:** SystemCapability.Utils.Lang

**参数:**

W
wangzhaoyong 已提交
477 478 479
| 参数名 | 类型          | 必填 | 说明                 |
| ------ | ------------- | ---- | -------------------- |
| task   | [Task](#task) | 是   | 需要取消执行的任务。 |
W
wangzhaoyong 已提交
480 481 482

**错误码:**

W
wangzhaoyong 已提交
483 484
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

B
buzhuyu 已提交
485 486
| 错误码ID | 错误信息                                      |
| -------- | -------------------------------------------- |
B
buzhuyu 已提交
487 488
| 10200015 | The task does not exist when it is canceled. |
| 10200016 | The task is executing when it is canceled.   |
W
wangzhaoyong 已提交
489

B
buzhuyu 已提交
490 491
从API version10开始,此接口调用时不再涉及上报错误码10200016。

B
buzhuyu 已提交
492
**正在执行的任务取消示例:**
W
wangzhaoyong 已提交
493

W
wangzhaoyong 已提交
494
```ts
B
buzhuyu 已提交
495
@Concurrent
B
buzhuyu 已提交
496 497 498 499 500 501 502
function inspectStatus(arg) {
    // 第一时间检查取消并回复
    if (taskpool.Task.isCanceled()) {
      console.log("task has been canceled before 2s sleep.");
      return arg + 2;
    }
    // 2s sleep
B
buzhuyu 已提交
503
    let t = Date.now();
B
buzhuyu 已提交
504 505 506 507 508 509 510 511 512
    while (Date.now() - t < 2000) {
      continue;
    }
    // 第二次检查取消并作出响应
    if (taskpool.Task.isCanceled()) {
      console.log("task has been canceled after 2s sleep.");
      return arg + 3;
    }
    return arg + 1;
513 514
}

B
buzhuyu 已提交
515 516 517 518 519 520
let task1 = new taskpool.Task(inspectStatus, 100); // 100: test number
let task2 = new taskpool.Task(inspectStatus, 200); // 200: test number
let task3 = new taskpool.Task(inspectStatus, 300); // 300: test number
let task4 = new taskpool.Task(inspectStatus, 400); // 400: test number
let task5 = new taskpool.Task(inspectStatus, 500); // 500: test number
let task6 = new taskpool.Task(inspectStatus, 600); // 600: test number
B
buzhuyu 已提交
521 522 523 524 525 526 527 528 529 530 531 532 533
taskpool.execute(task1).then((res)=>{
  console.log("taskpool test result: " + res);
}).catch((err) => {
  console.log("taskpool test occur error: " + err);
});
let res2 = taskpool.execute(task2);
let res3 = taskpool.execute(task3);
let res4 = taskpool.execute(task4);
let res5 = taskpool.execute(task5);
let res6 = taskpool.execute(task6);
// 1s后取消task
setTimeout(()=>{
  taskpool.cancel(task1);}, 1000);
B
buzhuyu 已提交
534 535
```

B
buzhuyu 已提交
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589
## taskpool.cancel<sup>10+</sup>

cancel(group: TaskGroup): void

取消任务池中的任务组。

**系统能力:** SystemCapability.Utils.Lang

**参数:**

| 参数名   | 类型                    | 必填 | 说明                 |
| ------- | ----------------------- | ---- | -------------------- |
| group   | [TaskGroup](#taskgroup) | 是   | 需要取消执行的任务组。 |

**错误码:**

以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)

| 错误码ID | 错误信息                                                 |
| -------- | ------------------------------------------------------- |
| 10200018 | The task group does not exist when it is canceled.      |

**示例:**

```ts
@Concurrent
function printArgs(args) {
    let t = Date.now();
    while (Date.now() - t < 2000) {
      continue;
    }
    console.log("printArgs: " + args);
    return args;
}

let taskGroup1 = new taskpool.TaskGroup();
taskGroup1.addTask(printArgs, 10); // 10: test number
let taskGroup2 = new taskpool.TaskGroup();
taskGroup2.addTask(printArgs, 100); // 100: test number
taskpool.execute(taskGroup1).then((res)=>{
  console.info("taskGroup1 res is:" + res)
});
taskpool.execute(taskGroup2).then((res)=>{
  console.info("taskGroup2 res is:" + res)
});
setTimeout(()=>{
  try {
    taskpool.cancel(taskGroup2);
  } catch (e) {
    console.log("taskGroup.cancel occur error:" + e);
  }
}, 1000);
```

W
wangzhaoyong 已提交
590 591 592 593 594 595
## 其他说明

### 序列化支持类型
序列化支持类型包括:All Primitive Type(不包括symbol)、Date、String、RegExp、Array、Map、Set、Object、ArrayBuffer、TypedArray。

### 注意事项
W
wangzhaoyong 已提交
596 597 598
- 仅支持在Stage模型且module的compileMode为esmodule的project中使用taskpool api。确认module的compileMode方法:查看当前module的build-profile.json5,在buildOption中补充"compileMode": "esmodule"。
- taskpool任务只支持引用入参传递或者import的变量,不支持使用闭包变量,使用装饰器@Concurrent进行拦截。
- taskpool任务只支持普通函数或者async函数,不支持类成员函数或者匿名函数,使用装饰器@Concurrent进行拦截。
B
buzhuyu 已提交
599
- 装饰器@Concurrent仅支持在ets文件使用。
W
wangzhaoyong 已提交
600

W
wangzhaoyong 已提交
601 602 603 604 605 606 607
### 简单使用

**示例一**

```ts
// 支持普通函数、引用入参传递
@Concurrent
B
buzhuyu 已提交
608
function printArgs(args) {
W
wangzhaoyong 已提交
609 610 611 612
    console.log("func: " + args);
    return args;
}

B
buzhuyu 已提交
613
async function taskpoolExecute() {
614
  // taskpool.execute(task)
B
buzhuyu 已提交
615
  let task = new taskpool.Task(printArgs, "create task, then execute");
616 617
  let val1 = await taskpool.execute(task);
  console.log("taskpool.execute(task) result: " + val1);
W
wangzhaoyong 已提交
618

619
  // taskpool.execute(function)
B
buzhuyu 已提交
620
  let val2 = await taskpool.execute(printArgs, "execute task by func");
621 622 623
  console.log("taskpool.execute(function) result: " + val2);
}

B
buzhuyu 已提交
624
taskpoolExecute();
W
wangzhaoyong 已提交
625 626
```

W
wangzhaoyong 已提交
627
**示例二**
W
wangzhaoyong 已提交
628

W
wangzhaoyong 已提交
629 630
```ts
// b.ets
B
buzhuyu 已提交
631
export let c = 2000;
W
wangzhaoyong 已提交
632 633 634 635 636
```
```ts
// 引用import变量
// a.ets(与b.ets位于同一目录中)
import { c } from "./b";
W
wangzhaoyong 已提交
637

W
wangzhaoyong 已提交
638
@Concurrent
B
buzhuyu 已提交
639
function printArgs(a) {
W
wangzhaoyong 已提交
640 641 642 643 644
    console.log(a);
    console.log(c);
    return a;
}

B
buzhuyu 已提交
645
async function taskpoolExecute() {
646
  // taskpool.execute(task)
B
buzhuyu 已提交
647
  let task = new taskpool.Task(printArgs, "create task, then execute");
648 649 650 651
  let val1 = await taskpool.execute(task);
  console.log("taskpool.execute(task) result: " + val1);

  // taskpool.execute(function)
B
buzhuyu 已提交
652
  let val2 = await taskpool.execute(printArgs, "execute task by func");
653 654
  console.log("taskpool.execute(function) result: " + val2);
}
W
wangzhaoyong 已提交
655

B
buzhuyu 已提交
656
taskpoolExecute();
W
wangzhaoyong 已提交
657 658 659 660 661 662 663
```

**示例三**

```ts
// 支持async函数
@Concurrent
B
buzhuyu 已提交
664
async function delayExcute() {
W
wangzhaoyong 已提交
665 666 667 668 669 670
  let ret = await Promise.all([
    new Promise(resolve => setTimeout(resolve, 1000, "resolved"))
  ]);
  return ret;
}

B
buzhuyu 已提交
671 672
async function taskpoolExecute() {
  taskpool.execute(delayExcute).then((result) => {
W
wangzhaoyong 已提交
673 674 675 676
    console.log("TaskPoolTest task result: " + result);
  });
}

B
buzhuyu 已提交
677
taskpoolExecute();
W
wangzhaoyong 已提交
678 679 680 681 682
```

**示例四**

```ts
B
buzhuyu 已提交
683 684 685 686 687
// c.ets
@Concurrent
function strSort(inPutArr) {
  let newArr = inPutArr.sort();
  return newArr;
W
wangzhaoyong 已提交
688
}
B
buzhuyu 已提交
689 690 691
export async function func1() {
    console.log("taskpoolTest start");
    let strArray = ['c test string', 'b test string', 'a test string'];
B
buzhuyu 已提交
692 693
    let task = new taskpool.Task(strSort, strArray);
    let result = await taskpool.execute(task);
B
buzhuyu 已提交
694
    console.log("func1 result:" + result);
W
wangzhaoyong 已提交
695 696
}

B
buzhuyu 已提交
697
export async function func2() {
W
wangzhaoyong 已提交
698
    console.log("taskpoolTest2 start");
B
buzhuyu 已提交
699 700 701
    let strArray = ['c test string', 'b test string', 'a test string'];
    taskpool.execute(strSort, strArray).then((result) => {
        console.log("func2 result: " + result);
W
wangzhaoyong 已提交
702 703 704 705 706
    });
}
```

```ts
B
buzhuyu 已提交
707
// a.ets(与c.ets在同一目录中)
W
wangzhaoyong 已提交
708 709
import { taskpoolTest1, taskpoolTest2 } from "./c";

B
buzhuyu 已提交
710 711
func1();
func2();
B
buzhuyu 已提交
712 713 714 715 716 717 718 719 720 721 722 723 724 725
```

**示例五**

```ts
// 任务取消成功
@Concurrent
function inspectStatus(arg) {
    // 第一时间检查取消并回复
    if (taskpool.Task.isCanceled()) {
      console.log("task has been canceled before 2s sleep.");
      return arg + 2;
    }
    // 2s sleep
B
buzhuyu 已提交
726
    let t = Date.now();
B
buzhuyu 已提交
727 728 729 730 731 732 733 734 735 736 737 738
    while (Date.now() - t < 2000) {
      continue;
    }
    // 第二次检查取消并作出响应
    if (taskpool.Task.isCanceled()) {
      console.log("task has been canceled after 2s sleep.");
      return arg + 3;
    }
    return arg + 1;
}

async function taskpoolCancel() {
B
buzhuyu 已提交
739
    let task = new taskpool.Task(inspectStatus, 100); // 100: test number
B
buzhuyu 已提交
740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
    taskpool.execute(task).then((res)=>{
      console.log("taskpool test result: " + res);
    }).catch((err) => {
      console.log("taskpool test occur error: " + err);
    });
    // 1s后取消task
    setTimeout(()=>{
      taskpool.cancel(task);}, 1000);
}

taskpoolCancel();
```

**示例六**

```ts
// 已执行的任务取消失败
@Concurrent
function inspectStatus(arg) {
    // 第一时间检查取消并回复
    if (taskpool.Task.isCanceled()) {
      return arg + 2;
    }
    // 延时2s
B
buzhuyu 已提交
764
    let t = Date.now();
B
buzhuyu 已提交
765 766 767 768 769 770 771 772 773 774 775
    while (Date.now() - t < 2000) {
      continue;
    }
    // 第二次检查取消并作出响应
    if (taskpool.Task.isCanceled()) {
      return arg + 3;
    }
    return arg + 1;
}

async function taskpoolCancel() {
B
buzhuyu 已提交
776
    let task = new taskpool.Task(inspectStatus, 100); // 100: test number
B
buzhuyu 已提交
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791
    taskpool.execute(task).then((res)=>{
      console.log("taskpool test result: " + res);
    }).catch((err) => {
      console.log("taskpool test occur error: " + err);
    });
    setTimeout(()=>{
      try {
        taskpool.cancel(task); // 任务已执行,取消失败
      } catch (e) {
        console.log("taskpool.cancel occur error:" + e);
      }
    }, 3000); // 延时3s,确保任务已执行
}

taskpoolCancel();
B
buzhuyu 已提交
792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834
```

**示例七**

```ts
// 待执行的任务组取消成功
@Concurrent
function printArgs(args) {
  let t = Date.now();
  while (Date.now() - t < 1000) {
    continue;
  }
  console.log("printArgs: " + args);
  return args;
}

async function taskpoolGroupCancelTest() {
  let taskGroup1 = new taskpool.TaskGroup();
  taskGroup1.addTask(printArgs, 10); // 10: test number
  taskGroup1.addTask(printArgs, 20); // 20: test number
  taskGroup1.addTask(printArgs, 30); // 30: test number
  let taskGroup2 = new taskpool.TaskGroup();
  let task1 = new taskpool.Task(printArgs, 100); // 100: test number
  let task2 = new taskpool.Task(printArgs, 200); // 200: test number
  let task3 = new taskpool.Task(printArgs, 300); // 300: test number
  taskGroup2.addTask(task1);
  taskGroup2.addTask(task2);
  taskGroup2.addTask(task3);
  taskpool.execute(taskGroup1).then((res) => {
    console.info("taskpool execute res is:" + res);
  }).catch((e) => {
    console.error("taskpool execute error is:" + e);
  });
  taskpool.execute(taskGroup2).then((res) => {
    console.info("taskpool execute res is:" + res);
  }).catch((e) => {
    console.error("taskpool execute error is:" + e);
  });

  taskpool.cancel(taskGroup2);
}

taskpoolGroupCancelTest()
W
wangzhaoyong 已提交
835
```