Maison > développement back-end > Golang > Pourquoi les programmes Go rencontrent-ils l''erreur fatale : toutes les goroutines sont endormies - blocage !\' et comment peut-elle être corrigée ?

Pourquoi les programmes Go rencontrent-ils l''erreur fatale : toutes les goroutines sont endormies - blocage !\' et comment peut-elle être corrigée ?

Patricia Arquette
Libérer: 2024-11-17 02:23:03
original
245 Les gens l'ont consulté

Why do Go programs encounter the

Go : Deadlock Panic - Comprendre la cause et y remédier

Dans Go, une erreur courante rencontrée est "erreur fatale : toutes les goroutines sont endormi - impasse!" lorsque vous essayez de gérer la communication entre les goroutines. Cette erreur se produit lorsque les goroutines restent bloquées dans un état où elles s'attendent toutes les unes les autres pour continuer.

Énoncé du problème

Considérez le code suivant où vous souhaitez lire une ligne de mots à partir d'un fichier texte, les stocker dans un canal, puis les imprimer individuellement :

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    for scanner.Scan() {
        line := scanner.Text()
        parts := strings.Fields(line)
        for i := range parts {
            file1chan <- parts[i]
        }
    }
    print(file1chan)
}

func print(in <-chan string) {
    for str := range in {
        fmt.Printf("%s\n", str)
    }
}
Copier après la connexion

Cause de the Deadlock

Lors de l'exécution de ce code, vous rencontrez l'erreur de blocage. Cela se produit parce que le canal file1chan n'est pas tamponné. Par conséquent, lorsque vous tentez d'envoyer une valeur dans le canal, celui-ci se bloque indéfiniment, en attendant un récepteur.

Résoudre l'impasse

Pour résoudre l'impasse, vous avez deux options :

  1. Utiliser un Buffered Channel :
    Vous pouvez créer un canal tamponné en spécifiant sa taille comme deuxième argument de make(chan), comme ceci :

    file1chan := make(chan string, 1) // buffer size of one
    Copier après la connexion

    Un canal tamponné agit comme un tableau, où le l'expéditeur peut envoyer des valeurs sans blocage si le canal dispose d'une capacité disponible.

  2. Utilisez un nouveau Goroutine :
    Vous pouvez démarrer une nouvelle goroutine pour envoyer des valeurs au canal sans tampon :

    file1chan := make(chan string)
    go func() { // start a new goroutine that sends strings down file1chan
        for scanner.Scan() {
            line := scanner.Text()
            parts := strings.Fields(line)
            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    
    print(file1chan)
    Copier après la connexion

    Avec cette approche, la nouvelle goroutine assume la responsabilité d'envoyer des valeurs, tandis que la goroutine principale se concentre lors de leur impression.

En mettant en œuvre l'une ou l'autre de ces solutions, vous éliminez efficacement l'impasse et permettez une communication fluide entre vos goroutines.

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