浅谈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后

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

posted @ 2019-07-23 16:46  myCodeLikeShit  阅读(2593)  评论(0编辑  收藏  举报