I have the following: http://play.golang.org/p/1aaive8KQx
When I print the runtime.NumGoroutine() I get 3. Shouldn't I be getting just 1? Why?
package main
import (
"log"
"runtime"
"time"
)
func main() {
for i := 1; i <= 10; i++ {
ch := make(chan int, 10)
timeout := time.Tick(1 * time.Second)
for i := 1; i <= 10; i++ {
go func(i int) {
time.Sleep(2 * time.Second)
ch <- i
}(i)
}
for i := 1; i <= 10; i++ {
select {
case j := <-ch:
log.Println(j)
case <-timeout:
log.Println("timeout")
}
}
log.Println("Processes", runtime.NumGoroutine())
}
}
There is a weird race condition. Basically what happens is when you call Println
some goroutines are still running but will terminate shortly. Put a sleep before Println
and you will get 1 Processes
. If you read the log you will see 2 timeouts - it means you skipped 2 channel reads in the loop. Somehow it gives your main goroutine time to read 8 values from the channel and call Println
before 2 goroutines are terminated. It's a race condition so it's hard to describe exactly what's going on. Apart from your code the scheduler and channels implementation also play major here.