Maison > développement back-end > Golang > Comment éviter les blocages lors de l'utilisation de sync.WaitGroup de Go ?

Comment éviter les blocages lors de l'utilisation de sync.WaitGroup de Go ?

Patricia Arquette
Libérer: 2024-12-07 13:34:13
original
887 Les gens l'ont consulté

How to Avoid Deadlocks When Using Go's sync.WaitGroup?

Dépannage des erreurs de blocage lors de l'utilisation de sync.WaitGroup

Lorsque vous travaillez avec des routines Go simultanées, la gestion de la synchronisation est cruciale pour éviter les blocages. Un de ces scénarios se produit lorsque vous essayez de coordonner plusieurs goroutines et d'attendre leur achèvement à l'aide de sync.WaitGroup. Cependant, parfois, vous pouvez rencontrer l'erreur : "erreur fatale : toutes les goroutines sont endormies - blocage !".

Cette erreur provient d'une utilisation incorrecte de sync.WaitGroup. Dans l'extrait de code fourni :

import "sync"

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

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go doWork(wg)
    }
    wg.Wait()
}
Copier après la connexion

Le problème réside dans la transmission de l'objet sync.WaitGroup directement à la fonction doWork. Lors du passage d'une valeur par valeur, une copie de l'objet est créée, ce qui entraîne un comportement inattendu.

Le correctif implique de passer un pointeur vers le sync.WaitGroup à la place :

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

Par en passant un pointeur, chaque goroutine fera référence au même objet WaitGroup, garantissant que Done() est appelé sur l'instance prévue. Cela résout le problème de blocage et permet au programme de s'exécuter sans erreur.

N'oubliez pas que lorsque vous utilisez sync.WaitGroup pour synchroniser des goroutines, transmettez toujours un pointeur vers l'objet pour garantir un comportement cohérent et éviter les blocages potentiels.

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