Go基础 专题
专题目录
您的位置:go > Go基础 专题 > Go超时(timeouts)实例
Go超时(timeouts)实例
作者:--    发布时间:2019-11-20

超时对于连接到外部资源或在不需要绑定执行时间的程序很重要。在go编程中由于使用了通道和选择(select),实现超时是容易和优雅的。
在这个示例中,假设正在执行一个外部调用,2秒后在通道c1上返回其结果。

这里是 select 实现超时。 res:= <-c1等待结果和<-time。等待在超时1秒后发送一个值。 由于选择继续准备好第一个接收,如果操作超过允许的1秒,则将按超时情况处理。

如果允许更长的超时,如:3s,那么从c2的接收将成功,这里将会打印结果。

运行此程序显示第一个操作超时和第二个操作超时。

使用此选择超时模式需要通过通道传达结果。这是一个好主意,因为其他重要的go功能是基于渠道和select。现在看看下面的两个例子:计时器和ticker

所有的示例代码,都放在 f:\worksp\golang 目录下。安装go编程环境请参考:http://www.h3.com/go/go_environment.html

timeouts.go的完整代码如下所示 -

package main

import "time"
import "fmt"

func main() {

    // for our example, suppose we're executing an external
    // call that returns its result on a channel `c1`
    // after 2s.
    c1 := make(chan string, 1)
    go func() {
        time.sleep(time.second * 2)
        c1 <- "result 1"
    }()

    // here's the `select` implementing a timeout.
    // `res := <-c1` awaits the result and `<-time.after`
    // awaits a value to be sent after the timeout of
    // 1s. since `select` proceeds with the first
    // receive that's ready, we'll take the timeout case
    // if the operation takes more than the allowed 1s.
    select {
    case res := <-c1:
        fmt.println(res)
    case <-time.after(time.second * 1):
        fmt.println("timeout 1")
    }

    // if we allow a longer timeout of 3s, then the receive
    // from `c2` will succeed and we'll print the result.
    c2 := make(chan string, 1)
    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")
    }
}

执行上面代码,将得到以下输出结果 -

f:\worksp\golang>go run timeouts.go
timeout 1
result 2

网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册