Maison > développement back-end > Golang > le corps du texte

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
Libérer: 2024-02-10 21:40:25
avant
976 Les gens l'ont consulté

为什么我会收到 - 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()
}
Copier après la connexion

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
        }
    }()
Copier après la connexion

Informez le groupe d'attente lorsque le consommateur a terminé :

go func() {
            defer wg.Done()
            for alphabet := range alphabetChannel {
                fmt.Println(alphabet)
            }
        }()
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!