Maison > Article > développement back-end > Comment passer WaitGroup à un appel de fonction séquentiel ?
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 ?
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!