es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el programa se bloquea por el canal en el select?

Quiero ejecutar varias goroutines y quiero que la función principal notifique a otras goroutines para que salgan. Aquí está mi código, pero el programa se bloquea en el select, el programa solo muestra “—–over—–“, sin “+++++over++++++”, ¿qué está mal en el código? Agradecido por su ayuda.

paquete principal

import(
    "fmt"
)

type A struct{
    exit chan bool
}

func (a *A) f(){
    select{
        //el proceso de la rutina

        //salir
        caso <- a.exit:

                fmt.Println("-----fin-----")
                a.exit <- true
                fmt.Println("+++++fin+++++")
        }
}

func main(){

    a := A{}

    go a.f()
    a.exit = make(chan bool)

    a.exit <- true
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el canal exit no está siendo leído por la sentencia select. En la función principal, estamos enviando un valor al canal exit y esperando que sea leído en la función f. Sin embargo, la sentencia select no está leyendo del canal correctamente.

    Para solucionar el problema, necesitamos modificar la sentencia select para incluir un caso para leer del canal exit. Aquí está el código modificado:

    func (a *A) f() {
        select {
        // el proceso de la rutina
    
        // salir
        case <-a.exit:
            fmt.Println("-----fin-----")
            a.exit <- true
            fmt.Println("+++++fin++++++")
            return // agregue esta línea para salir de la función
        }
    }
    
    func main() {
    
        a := A{}
    
        go a.f()
        a.exit = make(chan bool)
    
        a.exit <- true
        <-a.exit // agregue esta línea para esperar a que la goroutine salga
    }
    

    En el código modificado, agregamos una sentencia return después de imprimir "+++++fin++++++". Esto saldrá de la función f y permitirá que la goroutine salga.

    También agregamos una línea de código en la función main para esperar a que la goroutine salga. Esto se hace leyendo del canal exit usando el operador <-. Dado que ya estamos escribiendo en el canal en la función f, sabemos que leer del canal desbloqueará el código y permitirá que el programa salga normalmente.

Comments are closed.