Maison  >  Article  >  développement back-end  >  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

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

WBOY
WBOYavant
2024-02-10 21:40:25976parcourir

为什么我会收到 - goroutines are sleeped 错误,因为生产者消费者问题

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.

Contenu de la question

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 !

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer