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

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

王林
王林avant
2024-02-05 22:57:191041parcourir

如何将 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()
}

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()
}()

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
}()

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()
    }()
}

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()
    }()
}

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

wg.Add(1)
launchMyFunc(wg)

// or
wg.Add(1)
launchFunc(wg, my_func)

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer