# task_race

## 功能

等待一组后台任务中最先完成的任务，并返回它的结果。`task_race(tasks)` 使用任务完成订阅唤醒，不通过 `done()` 加 `sleep()` 轮询。

## 语法

```bt
value = task_race(tasks)
```

## 参数

| 参数 | 类型 | 必填 | 默认值 | 说明 |
| ------ | ------ | ------ | ------ | ------ |
| tasks | Array&lt;Task&gt; | 是 | 无 | 要竞争完成结果的 Task 数组。 |

## 返回值

| 类型 | 说明 |
| ------ | ------ |
| 任意值 / Empty | 返回最先完成任务的结果；空数组返回 `empty`。 |

如果胜出的任务 `throw`，`task_race()` 会重新抛出；如果胜出的任务普通失败，则返回运行时错误。其他未完成任务会继续运行，不会被强制取消。

## 示例

```bt
fast = task(fn() {
    return 'fast'
})

slow = task(fn() {
    sleep(1000)
    return 'slow'
})

value = task_race([slow, fast])

// 输出：fast
print value
```

```bt
value = task_race([])

// 输出：empty
print value
```

## 注意事项

- 参数必须是数组，数组元素必须全部是 Task。
- 注册前已有任务完成时，按输入顺序返回第一个已完成任务。
- 多个任务几乎同时完成时，按完成事件进入等待通道的顺序返回；同一轮已完成扫描按输入顺序打破平局。
- 同一个 Task 在数组中出现多次时，按输入位置视为多个候选。
- `task_race()` 会阻塞当前执行流；Web 请求热路径中应谨慎使用。
