Maison > développement back-end > Golang > Pourquoi l'utilisation de « sync.WaitGroup » entraîne-t-elle une « erreur fatale : toutes les goroutines sont endormies - blocage ! », et comment puis-je y remédier ?

Pourquoi l'utilisation de « sync.WaitGroup » entraîne-t-elle une « erreur fatale : toutes les goroutines sont endormies - blocage ! », et comment puis-je y remédier ?

Mary-Kate Olsen
Libérer: 2024-12-04 20:52:13
original
335 Les gens l'ont consulté

Why Does Using `sync.WaitGroup` Lead to

Comprendre et résoudre « erreur fatale : toutes les goroutines sont endormies - impasse » lors de l'utilisation de sync.WaitGroup

Lors de la tentative de coordination de l'achèvement de plusieurs goroutines à l'aide de sync.WaitGroup , on peut rencontrer l'erreur "erreur fatale : toutes les goroutines sont endormies - impasse !" Ce message énigmatique peut être déroutant, surtout lorsque le code semble être écrit selon les exemples de la documentation.

La source de cette erreur réside dans la façon dont Go gère les valeurs transmises aux fonctions. Lors du passage direct d'un objet sync.WaitGroup, Go crée une copie de cette valeur, en passant essentiellement un objet différent à chaque goroutine. Cela crée une déconnexion entre le WaitGroup d'origine et les copies sur lesquelles les goroutines opèrent.

La solution à ce problème consiste à passer un pointeur vers le sync.WaitGroup à la place. Ce faisant, toutes les goroutines référenceront le même objet sous-jacent et fonctionneront de manière cohérente sur ses compteurs internes. Le code correct utilisant un pointeur est fourni ci-dessous :

import "sync"

func doWork(wg *sync.WaitGroup) error {
    defer wg.Done()
    // Do some heavy lifting... request URL's or similar
    return nil
}

func main() {
    wg := &sync.WaitGroup{} // Use pointer to pass the WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go doWork(wg)
    }
}
Copier après la connexion

Avec cette modification, les goroutines interagiront correctement avec l'objet WaitGroup, incrémentant son compteur avant de commencer leur travail et le décrémentant une fois terminé. Par conséquent, l'appel WaitGroup.Wait() dans la fonction principale ne se bloquera pas indéfiniment et le programme s'exécutera 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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal