Resolviendo el punto muerto de las goroutinas

He estado tratando de resolver este simple problema que encontré en la concurrencia de Golang. He estado buscando todas las soluciones posibles, pero no encontré nada específico para mi problema (o podría perderme una). Aquí está mi código:

package main

import (
    "fmt"
    "time"
)

func producer(ch chan int, d time.Duration, num int) {

    for i:=0; i<num; i++ {
        ch <- i
        time.Sleep(d)
    }
}

func main() {
    ch := make(chan int)

    go producer(ch, 100*time.Millisecond, 2)
    go producer(ch, 200*time.Millisecond, 5)

    for {
        fmt.Println(<-ch)    
    }

    close(ch)
}

Imprime error:

error fatal: todas las gorutinas están dormidas - ¡punto muerto!

goroutine 1 [recepción de chan]: main.main () D: /Code/go/src/testconcurrency/main.go: 23 + 0xca estado de salida 2

¿Cuál es la forma eficiente de evitar este error? Gracias.

Respuestas a la pregunta(5)

Su respuesta a la pregunta