Maison >développement back-end >Golang >Pourquoi est-ce que je reçois une erreur - les goroutines sont en veille en raison d'un problème de producteur et de consommateur
L'éditeur PHP Youzi peut rencontrer un message d'erreur courant lors de la résolution de problèmes de programmation : "les goroutines sont en veille". Cette erreur est généralement liée à des problèmes producteur-consommateur. Le problème producteur-consommateur est un scénario classique en programmation concurrente, dans lequel un ou plusieurs producteurs génèrent des données et un ou plusieurs consommateurs extraient les données pour les traiter. Lorsque le producteur génère des données plus rapidement que le consommateur ne peut les traiter, les goroutines (threads légers dans le langage Go) peuvent se mettre en veille. Cet article explique pourquoi cette erreur se produit et propose une solution.
C'est le code - producteur et plusieurs consommateurs en routine. Le producteur injecte des informations dans un canal et plusieurs consommateurs (chacun via une routine go) doivent les lire en parallèle.
func main() { alphabetArray := []string{"A", "B", "C"} alphabetChannel := make(chan string, 3) // producer. go func() { for _, alphabet := range alphabetArray { alphabetChannel <- alphabet } }() var wg sync.WaitGroup // spawn 10 consumers, consumers represented as a go-routine. for idx := 0; idx < 10; idx++ { wg.Add(1) go func() { for alphabet := range alphabetChannel { fmt.Println(alphabet) } }() } wg.Wait() }
Voici le lien vers le terrain de jeu - https://go.dev/play/p/yndataeexpb
L'erreur que j'ai reçue est la suivante -
Un Deuxième c Erreur fatale : tous les goroutines dorment - impasse !
Fermez la chaîne lorsque le producteur a terminé afin que le consommateur sache quand s'arrêter :
go func() { defer close(alphabetchannel) for _, alphabet := range alphabetarray { alphabetchannel <- alphabet } }()
Informez le groupe d'attente lorsque le consommateur a terminé :
go func() { defer wg.Done() for alphabet := range alphabetChannel { fmt.Println(alphabet) } }()
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!