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