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 ?
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 :
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.
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!