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后
其实这代表每次从通道中获取数据的超时时间,如果又有新的数据输入,那么时间会重新计时