浅谈Go中的time.After


go的一条哲学是

不要通过共享来实现通信,而是通信来实现共享

多协程之间通过 channel 来实现通信,而普遍会遇到的问题是,如何进行超时控制,资料一查询,需要配置selecttime.After一起使用,一开始我以为是整体的超时时间,后面经过下面的这番时间,发现并不是


func main(){
	c := make(chan int)
	fmt.Println(time.Now())
	go func(){
		time.Sleep(500*time.Millsecond)
		c <- 0
		time.Sleep(500*time.Millsecond)
		c <- 1
	}()
	
	for {
		select {
		case p := <- c:
			fmt.Printf("p=%d\n",c)
		case <-time.After(1*time.Second):
			fmt.Println(time.Now())
			fmt.Printf("timeout")
			return
		}
	}
}

执行的结果是

设置的超时时间是1s,而timeout的时间点是开始执行的2s后

其实这代表每次从通道中获取数据的超时时间,如果又有新的数据输入,那么时间会重新计时


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM