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") 
}
原文地址:https://www.cnblogs.com/wt645631686/p/9691226.html