Estoy trabajando en un ejercicio de uso de canales para implementar una cola. Específicamente, estoy tratando de usar el tamaño de un canal para limitar el número de goroutines simultáneos. A saber, he escrito el siguiente código:Necesito ayuda para entender por qué select {} no está bloqueando para siempre
package main
import "fmt"
import "time"
import "math/rand"
func runTask (t string, ch *chan bool) {
start := time.Now()
fmt.Println("starting task", t)
time.Sleep(time.Millisecond * time.Duration(rand.Int31n(1500))) // fake processing time
fmt.Println("done running task", t, "in", time.Since(start))
<- *ch
}
func main() {
numWorkers := 3
files := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"}
activeWorkers := make(chan bool, numWorkers)
for _, f := range files {
activeWorkers <- true
fmt.Printf("activeWorkers is %d long.\n", len(activeWorkers))
go runTask(f, &activeWorkers)
}
select{}
}
En este momento, el código se bloquea con:
throw: all goroutines are asleep - deadlock!
Mi expectativa era que la llamada para seleccionar bloquearía para siempre y dejar que los goroutines terminan sin punto muerto.
Así que tengo una pregunta doble: ¿por qué no seleccionar el bloqueo para siempre y, a menos de lanzar en un tiempo.Duerma() llamada después del ciclo for, ¿cómo puedo evitar interbloqueos?
Saludos,
-mtw
Tendría cuidado con eso; todo lo que pasa pasa por valor. De hecho, los mapas y las divisiones se copian, sin embargo, parte de los datos copiados incluye punteros a los datos subyacentes. http://golang.org/doc/faq#pass_by_value. Es una distinción sutil pero importante; Los sectores tienen otros datos que no son punteros y que no se comparten. – Greg
@Greg: "Los mapas y las divisiones se han copiado". Dividir pelos, creo. Según la documentación que vinculó: "Los valores de mapa y segmentación se comportan como indicadores ... Copiar un mapa o un valor de corte no copia los datos a los que apunta". Mi terminología no está en consonancia con lo que usan los documentos Go ahora, pero la semántica es en gran medida equivalente. – Ashe
@Greg: he limpiado la prosa allí un poco. – Ashe