Go 协程超时控制
Go 协程超时控制
- Select 阻塞方式
- Context 方式
先说个场景:
假设业务中 A 服务需要调用 服务B,要求设置 5s 超时,那么如何优雅实现?
Select 超时控制
考虑是否可以用 select + time.After 方式进行实现
这里主要利用的是通道在携程之间通信的特点,当程序调用成功后,会向通道中发送信号。没调用成功前,通道会阻塞。
select {
case res := <-c2:
fmt.Println(res)
case <-time.After(time.Second * 3):
fmt.Println("timeout 2")
}
当c2通道中有数据时,并且超时时间没有达到 3s,走 case res := <-c2 这个业务逻辑,当超时时间达到 3s , 走的 case <-time.After(time.Second * 3) 这个业务逻辑, 这样就可以实现超时 3s的控制。
res:= <-c2 是因为channel 可以实现阻塞,那么time.After为啥可以阻塞呢?

浙公网安备 33010602011771号