首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go程序例子(34):超时

Go程序例子(34):超时

原创
作者头像
用户11078756
发布2024-12-18 09:13:47
发布2024-12-18 09:13:47
1740
举报
文章被收录于专栏:go程序例子go程序例子

对于连接外部资源或需要限制执行时间的程序来说,超时非常重要。由于通道和 select,在 Go 中实现超时既简单又优雅。

代码语言:go
复制
package main

import (
    "fmt"
    "time"
)

func main() {
	// 在我们的示例中,假设我们正在执行一个外部调用,该调用在 2 秒后通过通道 c1 返回其结果。请注意,通道是有缓冲的,因此 goroutine 中的发送操作是非阻塞的。这是一个常见的模式,用于防止在通道永远没有被读取的情况下发生 goroutine 泄漏。
    c1 := make(chan string, 1)
    go func() {
        time.Sleep(2 * time.Second)
        c1 <- "result 1"
    }()
	// 这是实现超时的 select 语句。res := <-c1 等待结果,而 <-time.After 等待在 1 秒超时后发送的值。由于 select 会选择第一个准备好的接收操作,如果操作超过了允许的 1 秒,我们将选择超时的情况。
    select {
    case res := <-c1:
        fmt.Println(res)
    case <-time.After(1 * time.Second):
        fmt.Println("timeout 1")
    }
	// 如果我们允许更长的超时(例如 3 秒),那么从 c2 的接收将会成功,我们将打印结果。
    c2 := make(chan string, 1)
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "result 2"
    }()
    select {
    case res := <-c2:
        fmt.Println(res)
    case <-time.After(3 * time.Second):
        fmt.Println("timeout 2")
    }
}

运行这个程序会显示第一个操作超时,第二个操作成功。

代码语言:javascript
复制
$ go run timeouts.go 
timeout 1
result 2

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档