Maison > développement back-end > Golang > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-23 10:16:11
original
964 Les gens l'ont consulté

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
}
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal