Maison  >  Article  >  développement back-end  >  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
Patricia Arquetteoriginal
2024-11-17 02:23:03162parcourir

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)
    }
}

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

    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)

    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!

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