Golang timeout is not executed with channels

后端 未结 1 620
自闭症患者
自闭症患者 2020-12-06 22:40

I am using goroutines/channels. Here is my code. Why is the timeout case not getting executed?

func main() {
    c1 := make(chan int, 1)

    go func() {
            


        
相关标签:
1条回答
  • 2020-12-06 23:06

    Your timeout doesn't happen, because one of your goroutine sends a value on your c1 channel in every 1.5 seconds (or so) repeatedly, and your timeout would only happen if there is no value to be received from c1 for 2 seconds.

    Once a value is received from c1, in the next iteration executing select again a new time.After() call will be made which which returns a new channel on which a value will only be sent after another 2 seconds. The timeout channel from the previous select execution is discarded and is not used anymore.

    To receive the timeout after 2 seconds, create the timeout channel only once, e.g.:

    timeout := time.After(2000 * time.Millisecond)
    for {
        select {
        case i := <-c1:
            fmt.Println(i)
        case <-timeout:
            fmt.Println("TIMEOUT") // Will get executed after 2 sec
        }
    }
    

    Output:

    10
    TIMEOUT
    10
    10
    10
    ...
    
    0 讨论(0)
提交回复
热议问题