Maison > développement back-end > Golang > Comment passer WaitGroup à un appel de fonction séquentiel ?

Comment passer WaitGroup à un appel de fonction séquentiel ?

王林
Libérer: 2024-02-05 22:57:19
avant
1059 Les gens l'ont consulté

如何将 WaitGroup 传递给顺序函数调用?

Contenu de la question

J'ai une fonction qui peut être appelée séquentiellement ou simultanément dans des goroutines distinctes.

Je veux m'assurer que la fonction est entièrement exécutée avant la fin de la goroutine principale, je passe donc l'argument *sync.waitgroup à la fonction. Désormais, à certains endroits, la fonction sera appelée de manière séquentielle.

Je peux transmettre nil waitgroup à la fonction comme ceci :

func my_func(wg *sync.WaitGroup){
   if wg != nil{
   defer wg.Done()
   }
   // do the task
}

func main(){
my_func(nil) // sequential call

wg := sync.WaitGroup{}
wg.Add(1)
go my_func(&wg)  // concurrent call
wg.Wait()
}
Copier après la connexion

Existe-t-il une meilleure façon d’atteindre cet objectif ?


Bonne réponse


La vôtre my_func() 不应该知道/不应该关心它是如何执行的(无论是否在新的 goroutine 中)。因此,为此您不应该传递 wg. Ne forcez pas l'utilisation simultanée ou non simultanée de votre API, laissez les utilisateurs de votre package décider comment ils souhaitent l'appeler.

Si quelqu'un souhaite l'exécuter simultanément, dans une nouvelle goroutine, cela peut être fait en my_func()外部处理 my_func() comme ceci :

wg.add(1)
go func() {
    defer wg.done()
    my_func()
}()
Copier après la connexion

Cela permet également de placer plus de code avant/après les appels de fonction qui seront exécutés avant l'appel wg.done() :

wg.add(1)
go func() {
    defer wg.done()

    // other code before
    my_func()
    // other code after
}()
Copier après la connexion

Notez également que si vous disposez de cette fonctionnalité à de nombreux endroits, vous pouvez créer une fonction d'assistance qui s'occupe du démarrage des goroutines et de la gestion des groupes d'attente :

func launchmyfunc(wg *sync.waitgroup) {
    go func() {
        defer wg.done()

        my_func()
    }()
}
Copier après la connexion

Vous pouvez également créer un assistant qui accepte n'importe quelle fonction sans paramètre et sans retour :

func launchfunc(wg *sync.waitgroup, f func()) {
    go func() {
        defer wg.done()

        f()
    }()
}
Copier après la connexion

En utilisant l'assistant ci-dessus, vous pouvez faire ceci :

wg.Add(1)
launchMyFunc(wg)

// or
wg.Add(1)
launchFunc(wg, my_func)
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!

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