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

Comment corriger « erreur fatale : toutes les goroutines sont endormies - blocage » dans Go ?

DDD
Libérer: 2024-11-18 07:41:02
original
697 Les gens l'ont consulté

How to Fix

Go : Comprendre et résoudre "Erreur fatale : toutes les goroutines sont endormies - impasse"

Lors de l'exécution d'un programme Go, rencontre du message d'erreur "Erreur fatale : toutes les goroutines sont endormies - blocage" indique que toutes les goroutines (threads légers) du programme sont bloquées indéfiniment, ce qui entraîne un blocage.

Dans le code fourni, ce problème survient en raison de la nature sans tampon de le canal "file1chan". Lorsqu'une valeur est envoyée à un canal sans tampon, elle se bloque si aucun autre goroutine n'est prêt à la recevoir. Dans ce cas, la goroutine principale envoie des valeurs à "file1chan" sans qu'aucune goroutine concurrente n'en reçoive, ce qui conduit à une impasse.

Solution 1 : introduire un modèle de concurrence

Pour résoudre l'impasse, introduisez un goroutine distinct et simultané qui reçoit les valeurs de "file1chan" et évite de bloquer le goroutine principal. Le code modifié avec une approche goroutine ci-dessous :

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    go func() { 
        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

Solution 2 : Utiliser un canal tamponné

Alternativement, vous pouvez utiliser un canal tamponné pour gérer un nombre fixe de valeurs sans provoquer de blocage. Un canal tamponné d'une capacité de un est suffisant pour cette tâche :

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string, 1)
    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 un canal tamponné, l'expéditeur peut continuer à s'exécuter même si le récepteur n'est pas encore prêt, évitant ainsi le blocage.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal