Deseo tener una rutina de escucha en dos canales, bloqueada cuando se agotan ambos canales. Sin embargo, si ambos canales contienen datos, quiero que uno sea drenado antes de que se maneje el otro.Prioridad en Go, seleccione la solución de la solución
En el siguiente ejemplo de trabajo, deseo que todos los out
se vacíen antes de manipular exit
. Utilizo una declaración select
-que no tiene ningún orden de prioridad. ¿Cómo puedo solucionar el problema, haciendo que los 10 valores positivos se manejen antes de la salida?
package main
import "fmt"
func sender(out chan int, exit chan bool){
for i := 1; i <= 10; i++ {
out <- i
}
exit <- true
}
func main(){
out := make(chan int, 10)
exit := make(chan bool)
go sender(out, exit)
L:
for {
select {
case i := <-out:
fmt.Printf("Value: %d\n", i)
case <-exit:
fmt.Println("Exiting")
break L
}
}
fmt.Println("Did we get all 10? Most likely not")
}
La idea es muy similar a la mía. Pero es verdad, con la declaración 'continue', te deshaces de la necesidad de una bandera. Inteligente. Bueno, esta es probablemente la mejor respuesta que puedo asumir. ¡Gracias! – ANisus
esto se repetirá infinitamente en la primera instrucción de selección si el canal de salida está cerrado. – jorelli
jorelli, bastante cierto. Si desea permitir que los goroutines hostiles o defectuosos cierren el canal de forma inesperada, debe verificar el estado correcto en la recepción. – Sonia