Maison >développement back-end >Golang >Comment éviter « l'erreur fatale : tous les goroutines sont endormis - impasse ! » avec sync.WaitGroup ?

Comment éviter « l'erreur fatale : tous les goroutines sont endormis - impasse ! » avec sync.WaitGroup ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-21 06:57:09424parcourir

How to Avoid

Comprendre "erreur fatale : toutes les goroutines sont endormies - impasse !" avec sync.WaitGroup

Lorsque vous essayez d'utiliser le package sync.WaitGroup pour gérer des goroutines simultanées, il est crucial d'éviter la redoutable "erreur fatale : toutes les goroutines sont endormies - impasse !". Cette erreur résulte d'une utilisation incorrecte de WaitGroup, en particulier lors de la transmission de la valeur par copie plutôt que par référence.

La cause du blocage

Le problème vient du fait que lorsque vous transmettez l'objet WaitGroup réel à la fonction doWork, Go fait une copie de la valeur. Cela signifie que le WaitGroup d'origine aura incrémenté le compteur de dix appels Add() sans aucun appel Done() correspondant. En revanche, chaque copie du WaitGroup transmise aux goroutines n'aura qu'un seul appel Done() et le nombre d'appels Add() qui étaient présents lorsque le WaitGroup a été copié.

La solution : passer un Pointeur vers WaitGroup

Pour résoudre ce blocage, il est essentiel de passer un pointeur vers le WaitGroup plutôt que vers l'objet WaitGroup lui-même. Cela garantit que toutes les goroutines font référence au même WaitGroup, et lorsqu'elles appellent Done(), le compteur décrémentant est appliqué au bon WaitGroup.

Code modifié

Ce qui suit le code modifié démontre l'utilisation correcte d'un pointeur vers WaitGroup :

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{}
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go doWork(wg)
    }

    wg.Wait()
}

En adoptant cette approche, vous pouvez gérer en toute confiance goroutines avec WaitGroup, évitant les pièges des blocages et garantissant une exécution simultanée efficace.

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:
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