Maison >développement back-end >Golang >Comment résoudre l'erreur « Tous les Goroutines sont endormis - Blocage » dans Go ?

Comment résoudre l'erreur « Tous les Goroutines sont endormis - Blocage » dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-23 10:16:111052parcourir

How to Resolve the

Go : erreur fatale "Tous les Goroutines sont endormis - Deadlock" expliquée

Dans Go, l'envoi vers un canal sans tampon bloque l'expéditeur jusqu'à ce qu'un Le récepteur est disponible. Dans le code fourni, la goroutine chargée d'envoyer les mots au canal file1chan est la seule goroutine, et il n'y a pas de récepteur. Par conséquent, l'expéditeur est bloqué indéfiniment, conduisant à une impasse.

Solution utilisant une nouvelle goroutine :

Une solution consiste à créer une goroutine distincte pour gérer l'envoi de mots. Cette goroutine ne bloquera pas la goroutine principale et permet une exécution simultanée.

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    go func() { // start a new goroutine that sends strings down file1chan 
        for scanner.Scan() {
            line := scanner.Text()

            // Split the line on a space
            parts := strings.Fields(line)

            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    print(file1chan) // read strings from file1chan
}

Solution utilisant un canal tamponné :

Une autre solution consiste à créer un canal tamponné, ce qui permet d'envoyer et de recevoir plusieurs valeurs simultanément. Pour le problème donné, une taille de tampon de un est suffisante.

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string, 1) // buffer size of one
    for scanner.Scan() {
        line := scanner.Text()

        // Split the line on a space
        parts := strings.Fields(line)

        for i := range parts {
            file1chan <- parts[i]
        }
    }
    close(file1chan) // we're done sending to this channel now, so we close it.
    print(file1chan)
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn