超时控制代码写法

2020-09-18  本文已影响0人  快感炮神

假设有一个耗时业务如下,将其改造成超时关闭

// 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())
}
上一篇下一篇

猜你喜欢

热点阅读