Maison >développement back-end >Golang >Comment résoudre l'impasse de Go « Tous les Goroutines sont endormis » dans la communication Goroutine ?
Impasse dans Go : comprendre et résoudre « Tous les Goroutines sont endormis »
Dans l'extrait de code Go fourni, une impasse se produit en raison d'un incompréhension de la communication goroutine. Le programme vise à simuler le chargement et le déchargement de camions, en utilisant des goroutines pour gérer le déchargement des camions. Cependant, le code ne parvient pas à fermer le canal des camions (ch) lorsque le processus de chargement est terminé, ce qui entraîne une impasse.
Pour résoudre cette impasse, il est crucial de fermer le canal des camions (ch) une fois que tous les camions ont été chargés. Cela signale à la goroutine UnloadTrucks qu'aucun autre camion ne sera envoyé, lui permettant de revenir.
Une façon d'y parvenir consiste à utiliser un WaitGroup, comme démontré dans le code suivant :
// Define a WaitGroup to track the completion of the loading goroutines var wg sync.WaitGroup // Start goroutines to load trucks go func() { // Load trucks and send them over the truck channel for t := range trucks { go func(tr Truck) { itm := Item{} itm.name = "Groceries" fmt.Printf("Loading %s\n", tr.name) tr.Cargo = append(tr.Cargo, itm) ch <- tr wg.Done() // Signal the WaitGroup that the loading is complete }(trucks[t]) } }() // Use the WaitGroup to wait for all loading goroutines to complete wg.Wait() // Close the truck channel after all loading is finished close(ch) // Start the UnloadTrucks goroutine UnloadTrucks(ch)
En fermant le canal des camions (ch) une fois que tous les camions ont été chargés, la goroutine UnloadTrucks est autorisée à se terminer, sortant ainsi de l'impasse. Le programme va maintenant se terminer avec succès, déchargeant tous les camions comme prévu.
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!