task_race
task_race
功能
等待一组后台任务中最先完成的任务,并返回它的结果。task_race(tasks) 使用任务完成订阅唤醒,不通过 done() 加 sleep() 轮询。
语法
value = task_race(tasks)
参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| tasks | Array<Task> | 是 | 无 | 要竞争完成结果的 Task 数组。 |
返回值
| 类型 | 说明 |
|---|---|
| 任意值 / Empty | 返回最先完成任务的结果;空数组返回 empty。 |
如果胜出的任务 throw,task_race() 会重新抛出;如果胜出的任务普通失败,则返回运行时错误。其他未完成任务会继续运行,不会被强制取消。
示例
fast = task(fn() { return 'fast' }) slow = task(fn() { sleep(1000) return 'slow' }) value = task_race([slow, fast]) // 输出:fast print value
value = task_race([]) // 输出:empty print value
注意事项
- 参数必须是数组,数组元素必须全部是 Task。
- 注册前已有任务完成时,按输入顺序返回第一个已完成任务。
- 多个任务几乎同时完成时,按完成事件进入等待通道的顺序返回;同一轮已完成扫描按输入顺序打破平局。
- 同一个 Task 在数组中出现多次时,按输入位置视为多个候选。
-
task_race()会阻塞当前执行流;Web 请求热路径中应谨慎使用。