所谓超时,比如上网浏览一些安全的网站,如果几分钟之后不做操作,那么就会让你重新登录。
就所谓有时候出现goroutine阻塞的情况,那么我们如何避免整个程序进入阻塞情况,这时候就可以用select来设置超时
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
quit := make(chan bool)
//新开一个协程
go func() {
for {
select {
case num := <-ch: //如果有数据,下面打印。但是有可能ch一直没数据
fmt.Println("num = ", num)
case <-time.After(3 * time.Second): //上面的ch如果一直没数据会阻塞,那么select也会检测其他case条件,检测到后3秒超时
fmt.Println("超时")
quit <- true //写入
}
}
}() //别忘了()
for i := 0; i < 5; i++ {
ch <- i
time.Sleep(time.Second)
}
<-quit //这里暂时阻塞,直到可读
fmt.Println("程序结束")
}
//这里注意观察打印过程
num = 0
num = 1
num = 2
num = 3
num = 4
超时
程序结束
补充代码
//防止读取超时
select {
case <- time.After(time.Second*2):
println("read channel timeout")
case i := <- ch:
println(i)
}
//防止写入超时
select {
case <- time.After(time.Second *2):
println("write channel timeout")
case ch <- "hello":
println("write ok")
}