协程超时处理
概念说明
并发任务可能因为网络、IO 或业务逻辑迟迟不返回。
如果调用方一直等待,程序就容易卡住。
常见做法是让任务结果通过 channel 返回,再用 select 同时等待“结果”和“超时信号”。
语法/规则
- 用结果 channel 接收 goroutine 的执行结果。
- 用
time.After(duration)创建超时信号。 - 用
select谁先到就处理谁。 - 真实项目中也常用
context.WithTimeout统一控制取消。 - 超时后仍要考虑后台 goroutine 是否会泄漏。
超时处理示例
| |
输出结果:
| |
这段 select 是怎么运行的
先看这两个等待对象:
| |
可以先理解成:
| |
再看 goroutine:
| |
它的意思是:
| |
所以时间顺序就是:
| |
所以这里进入超时分支,不是随机的。
而是因为:
| |
结果还没来,超时信号先到了,所以执行:
| |
常见错误
- 只等待结果 channel,没有设置超时,导致调用方可能一直阻塞。
- 使用无缓冲结果 channel,超时后后台 goroutine 发送结果时可能被卡住。
- 认为超时分支执行后 goroutine 会自动停止,实际它仍可能继续运行。