Go : erreur fatale "Tous les Goroutines sont endormis - Deadlock" expliquée
Dans Go, l'envoi vers un canal sans tampon bloque l'expéditeur jusqu'à ce qu'un Le récepteur est disponible. Dans le code fourni, la goroutine chargée d'envoyer les mots au canal file1chan est la seule goroutine, et il n'y a pas de récepteur. Par conséquent, l'expéditeur est bloqué indéfiniment, conduisant à une impasse.
Solution utilisant une nouvelle goroutine :
Une solution consiste à créer une goroutine distincte pour gérer l'envoi de mots. Cette goroutine ne bloquera pas la goroutine principale et permet une exécution simultanée.
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) go func() { // start a new goroutine that sends strings down file1chan for scanner.Scan() { line := scanner.Text() // Split the line on a space parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan) // read strings from file1chan }
Solution utilisant un canal tamponné :
Une autre solution consiste à créer un canal tamponné, ce qui permet d'envoyer et de recevoir plusieurs valeurs simultanément. Pour le problème donné, une taille de tampon de un est suffisante.
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string, 1) // buffer size of one for scanner.Scan() { line := scanner.Text() // Split the line on a space parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) // we're done sending to this channel now, so we close it. print(file1chan) }
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!