Impasse dans Go : "lancer : toutes les goroutines sont endormies"
Dans un programme Go, une impasse se produit lorsque deux goroutines ou plus attendent pour que l'autre finisse, ce qui aboutit à un état gelé dans lequel aucun progrès ne peut être réalisé. Ce problème est souvent signalé comme "lancer : toutes les goroutines sont endormies - blocage !"
Analysons un programme Go simplifié pour comprendre pourquoi ce blocage se produit :
package main import ( "fmt" ) func total(ch chan int) { res := 0 for iter := range ch { res += iter } ch <- res } func main() { ch := make(chan int) go total(ch) ch <- 1 ch <- 2 ch <- 3 fmt.Println("Total is ", <-ch) }
Dans ce programme, le La fonction total calcule la somme des nombres envoyés via le canal ch et renvoie le résultat sur le même canal. L'impasse survient parce que les conditions suivantes sont remplies :
Cela crée une situation de blocage où les deux goroutines (celle du total cumulé et celle en principal) attendent que l'autre agisse, conduisant à l'erreur "lancer : toutes les goroutines sont endormies".
Pour résoudre cette impasse, nous pouvons fermer le canal ch dans la fonction principale après l'envoi de la dernière valeur :
ch <- 3 close(ch)
La fermeture du canal signale à la goroutine totale qu'il n'y a plus d'entrée, lui permettant de terminer son calcul et de renvoyer le résultat sur ch .
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!