By neohwang


2016-01-20 08:26:57 8 Comments

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() {
        for {
            time.Sleep(1500 * time.Millisecond)
            c1 <- 10
        }
    }()

    go func() {
        for {
            select {
            case i := <-c1:
                fmt.Println(i)
            case <-time.After(2000 * time.Millisecond):
                fmt.Println("TIMEOUT") // <-- Not Executed
            }
        }
    }()

    fmt.Scanln()
}

1 comments

@icza 2016-01-20 08:35:29

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
...

Related Questions

Sponsored Content

12 Answered Questions

[SOLVED] How to dispatch a Redux action with a timeout?

4 Answered Questions

[SOLVED] golang using timeouts with channels

  • 2014-05-10 14:19:59
  • Kamal
  • 19284 View
  • 15 Score
  • 4 Answer
  • Tags:   go channels

2 Answered Questions

[SOLVED] Range a channel finishes with deadlock

  • 2017-07-10 19:52:40
  • user8285681
  • 948 View
  • 2 Score
  • 2 Answer
  • Tags:   go

1 Answered Questions

[SOLVED] Signal goroutines to stop with channel close

  • 2018-11-12 21:43:50
  • Chen A.
  • 1024 View
  • 1 Score
  • 1 Answer
  • Tags:   go channel

1 Answered Questions

[SOLVED] golang channel wierd deadlock related with make

  • 2017-07-28 07:05:16
  • occia
  • 141 View
  • 1 Score
  • 1 Answer
  • Tags:   go channel

8 Answered Questions

[SOLVED] Android error: Failed to install *.apk on device *: timeout

2 Answered Questions

Sponsored Content