• 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") 
    }
  • 相关阅读:
    Linux文件和目录
    Android/ios手机销售榜
    项目开发流程
    游戏签到系统测试点
    项目上线后出现问题,该如何解决?
    公交地铁出行测试点
    初学测试
    测试用例的优先级
    Django的MVT模式与MVC模式
    JWT安装配置
  • 原文地址:https://www.cnblogs.com/wt645631686/p/9691226.html
Copyright © 2020-2023  润新知