个人理解的channel超时处理思路分享,若有错误或者不足,请联系我:qq 869329877
package main
import "time"
import "fmt"
func main() {
ch := make(chan int)
go timeout(10, 14, ch)
hah:=<-ch
fmt.Println("主程序打印出来=",hah)
}
//todo 这里是方法
func timeout(a,b int,params chan int) {
ch := make(chan int)
go func() {
//todo 逻辑处理
c := a + b
//todo 手动在这里做睡眠,在实际生产环境中,是不会出现这样的情况,我这里是为了做数据测试
time.Sleep(5 * time.Second)
//todo 最后把值给丢出去
ch <- c
}()
select {
case res := <-ch:
fmt.Println(res)
params <- res
case <-time.After(time.Second * 3):
fmt.Println("超时了")
params <- 0
}
}
主程序通过go timeout()挂起一个协程,在timeout方法里面利用select来监控逻辑处理的变化,如果请求时间过长或者连接到其他服务比如grpc、mysql等服务中断导致的请求时间过长,则直接超时,超时要返回定义的管道数据结果,否则程序会报错。
有疑问加站长微信联系(非本文作者)