go time.after

Golang time after典型用法

time after触发,例子:

package main
import (
	"fmt"
	"time"
)
func main() {
	fmt.Println("Start Time =", time.Now())
	a := time.After(5*time.Second)
	fmt.Println(<-a)
	fmt.Println("End Start Time =", time.Now())
}

程序运行后,输出如下图所示:
在这里插入图片描述
我们看到,time After 在等待了 5 秒之后,返回了一个只读的 channel。因此,如果将 After() 放进 select 语句块的一个 case 中,那么就可以让其它的 case 有一定的时间长度来监听读、写事件。

如果在这段时长内其它 case 还没有有可读、可写事件,这个 After() 所在 case 就会结束当前的 select,然后终止 select (如果 select 未在循环中)或进入下一轮 select (如果 select 在循环中)。

time after设置超时,例子

package main
import (
	"fmt"
	"time"
)
func main() {
	ch1 := make(chan string)
	// 激活一个goroutine,但5秒之后才发送数据
	go func() {
		time.Sleep(5 * time.Second)
		ch1 <- "put value into ch1"
	}()
	select {
	case val := <-ch1:
		fmt.Println("recv value from ch1:",val)
		return
	// 只等待3秒,然后就结束
	case <-time.After(3 * time.Second):
		fmt.Println("3 second over, timeover")
	}
}

程序运行后,输出如下图所示:
在这里插入图片描述

上面出现了超时现象,因为新激活的 goroutine 首先要等待 5 秒,然后才将数据发送到 channel ch1 中。但是 main goroutine 继续运行到 select 语句块,由于第一个 case 未满足条件(注意,main goroutine 并不会因此而阻塞)。

评估第二个 case 时,将执行 time.After() 等待 3 秒,3 秒之后读取到该函数返回的通道数据,于是该 case 满足 select 的条件,该 select 因为没有在循环中,所以直接结束,main goroutine 也因此而终止。自始至终,新激活的 goroutine都没有机会将数据发送到 ch1 中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值