zoukankan      html  css  js  c++  java
  • select 与 time.After 配合使用的问题

    今天在工作中发现了一个有趣的现象。

    在一个select中设定了两个定时器,本来预计哪个定时器到达就运行相应指令的,但是发现最终只有时间最短的定时器一直得到执行,其它定时器完全没有得到执行。

    package main
    
    import (
    "fmt"
    "time"
    )
    
    func main(){
        for i:=0; i< 3;i ++ {
            select{
                case <-time.After(7*time.Second):
                    fmt.Println("1 second")
                    
                case <-time.After(5*time.Second):
                    fmt.Println("8 seconds")
            }
        }
    }

    服务器输出是:

    8 seconds
    8 seconds
    8 seconds

    在stackoverflow上有人提到了,time.After每次都会返回一个新的channel,所以select不可能监测到新产生的channel:
    https://stackoverflow.com/questions/39212333/how-can-i-use-time-after-and-default-in-golang
    package main
    
    import (
    "fmt"
    "time"
    )
    
    func main(){
        count := 0
        timeout1 := time.After(7*time.Second)
        timeout2 := time.After(5*time.Second)
        for i:=0; i< 36; i++{
            select{
                case <-timeout1:
                    fmt.Println(count, "7 second")
                    
                case <-timeout2:
                    fmt.Println(count, "5 seconds")
                    
                default:
                    fmt.Println(count, "Just wait")
                    
            }
            count++
            time.Sleep(1*time.Second)
        }
    }
    0 Just wait
    1 Just wait
    2 Just wait
    3 Just wait
    4 Just wait
    5 5 seconds
    6 Just wait
    7 7 second
    8 Just wait
    9 Just wait
    10 Just wait
    11 Just wait
    12 Just wait
    13 Just wait
    14 Just wait
    15 Just wait
    16 Just wait
    17 Just wait
    18 Just wait
    19 Just wait
    20 Just wait
    21 Just wait
    22 Just wait
    23 Just wait
    24 Just wait
    25 Just wait
    26 Just wait
    27 Just wait
    28 Just wait
    29 Just wait
    30 Just wait
    31 Just wait
    32 Just wait
    33 Just wait
    34 Just wait
    35 Just wait
     
  • 相关阅读:
    Distributed System
    APP专项测试之兼容性测试
    面试如何正确谈薪?
    跳槽季,如何做好技术面试准备?
    Appium基础
    设置安装程序位置
    获取文件版本号
    28-PV&PVC
    Docker-文件拷贝
    Kubemark压测常用命令
  • 原文地址:https://www.cnblogs.com/elaron/p/8716977.html
Copyright © 2011-2022 走看看