看范例学 Golang (二十八)- 超时

超时

超时 对于程序操作外部资源或者管理自身程序执行时间非常重要。在 Go 语言中,因为 channel 与 select ,所以实现超时非常容易与优雅。

package main
import "time"
import "fmt"
func main() {

我们执行一个 goroutine ,其中逻辑为等待 2 秒后返回结果到 channel c1 中。

    c1 := make(chan string)
    go func() {
        time.Sleep(time.Second * 2)
        c1 <- "result 1"
    }()

这里我们使用 select 实现了超时, res := <-c1 等待 channel 返回结果, <-Time.After 等待计时器 1 秒。因为 select 会先处理第一个的返回,所以当时间到达 1 秒后,计时器返回, select 过程完成,这样我们就实现了一个超时。

    select {
    case res := <-c1:
        fmt.Println(res)
    case <-time.After(time.Second * 1):
        fmt.Println("timeout 1")
    }

如果我们设置一个超时为 3 秒,那么我们将会接收到 c2</code 传回来的值。

    c2 := make(chan string)
    go func() {
        time.Sleep(time.Second * 2)
        c2 <- "result 2"
    }()
    select {
    case res := <-c2:
        fmt.Println(res)
    case <-time.After(time.Second * 3):
        fmt.Println("timeout 2")
    }
}

运行程序,我们可以看到,第一次操作超时,第二次操作成功。

$ go run timeouts.go
timeout 1
result 2