浅谈Go中的time.After
go的一条哲学是
不要通过共享来实现通信,而是通信来实现共享
多协程之间通过 channel 来实现通信,而普遍会遇到的问题是,如何进行超时控制,资料一查询,需要配置select
和time.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后
其实这代表每次从通道中获取数据的超时时间,如果又有新的数据输入,那么时间会重新计时