假设有一个耗时业务如下,将其改造成超时关闭
// demo 假设耗时业务
func demo() string {
time.Sleep(time.Second * 3)
return "success"
}
改造方法如下
// demo
// 将结果改由channel,并且立刻返回
// 真正的业务处理放到协程里
func demo() chan string {
result := make(chan string)
// 处理原有逻辑,避免阻塞
go func() {
time.Sleep(time.Second * 3)
result <- "success"
}()
return result
}
func run() (interface{}, error) {
c := demo()
select {
case res := <-c:
return res, nil
case <-time.After(time.Second * 2): // 超时处理
return nil, fmt.Errorf("timeout")
}
}
func main() {
fmt.Println(run())
}
网友评论