Golang利用select实现超时机制


所谓超时,比如上网浏览一些安全的网站,如果几分钟之后不做操作,那么就会让你重新登录。
就所谓有时候出现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") }

 


免责声明!

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



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