Maison >développement back-end >Golang >Go Deadlocks : Comment éviter l'erreur « Tous les goroutines sont endormis » ?
Impression dans Go : "lancer : toutes les goroutines sont endormies"
Une impasse de goroutine se produit lorsque toutes les goroutines en cours d'exécution s'attendent les unes les autres pour complet. Dans le code Go fourni, une impasse survient en raison du canal ch non fermé.
La fonction totale attend en permanence de nouvelles valeurs sur le canal ch à l'aide d'une boucle de plage. Puisque le canal ch n'est jamais fermé, la boucle ne se terminera jamais. Cela signifie que la goroutine chargée d'exécuter cette fonction ne terminera jamais.
Pendant ce temps, dans la fonction principale, le programme tente d'envoyer des valeurs au canal ch et de recevoir le résultat. Cependant, comme le goroutine total attend indéfiniment, il ne peut pas traiter les valeurs envoyées et renvoyer le résultat. Cela provoque un blocage du programme.
Pour résoudre ce blocage, le canal ch doit être fermé après l'envoi de toutes les valeurs. Cela signalera à la fonction totale d'arrêter d'attendre de nouvelles valeurs et de calculer le résultat.
Voici une version modifiée du code avec la fermeture du canal :
package main import ( "fmt" ) func total(in chan int, out chan int) { res := 0 for iter := range in { res += iter } out <- res // sends back the result } func main() { ch := make(chan int) rch := make(chan int) go total(ch, rch) ch <- 1 ch <- 2 ch <- 3 close(ch) // this will end the loop in the total function result := <-rch // waits for total to give the result fmt.Println("Total is ", result) }
Maintenant, le total cumulé de la goroutine effectuera correctement la sommation et renverra le résultat à main, évitant ainsi une impasse.
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!