Heim > Artikel > Backend-Entwicklung > Wie übergebe ich WaitGroup an einen sequentiellen Funktionsaufruf?
Ich habe eine Funktion, die in separaten Goroutinen nacheinander oder gleichzeitig aufgerufen werden kann.
Ich möchte sicherstellen, dass die Funktion vollständig ausgeführt wird, bevor die Haupt-Goroutine abgeschlossen ist, also übergebe ich das Argument *sync.waitgroup an die Funktion. Nun wird die Funktion an manchen Stellen sequentiell aufgerufen.
Ich kann nil waitgroup wie folgt an die Funktion übergeben:
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() }
Gibt es einen besseren Weg, dieses Ziel zu erreichen?
Deine my_func()
不应该知道/不应该关心它是如何执行的(无论是否在新的 goroutine 中)。因此,为此您不应该传递 wg
. Erzwingen Sie nicht die gleichzeitige oder nicht gleichzeitige Nutzung Ihrer API, sondern lassen Sie die Benutzer Ihres Pakets entscheiden, wie sie es aufrufen möchten.
Wenn jemand es gleichzeitig in einer neuen Goroutine ausführen möchte, kann dies in my_func()
的外部处理 my_func()
so erfolgen:
wg.add(1) go func() { defer wg.done() my_func() }()
Dadurch ist es auch möglich, vor/nach Funktionsaufrufen mehr Code zu platzieren, der vor dem wg.done()
-Aufruf ausgeführt wird:
wg.add(1) go func() { defer wg.done() // other code before my_func() // other code after }()
Beachten Sie außerdem, dass Sie, wenn Sie diese Funktionalität an vielen Stellen haben, eine Hilfsfunktion erstellen können, die sich um den Goroutine-Start und die Wartegruppenverwaltung kümmert:
func launchmyfunc(wg *sync.waitgroup) { go func() { defer wg.done() my_func() }() }
Sie können auch einen Helfer erstellen, der alle Parameter- und Rückgabefunktionen akzeptiert:
func launchfunc(wg *sync.waitgroup, f func()) { go func() { defer wg.done() f() }() }
Mit dem oben genannten Helfer können Sie Folgendes tun:
wg.Add(1) launchMyFunc(wg) // or wg.Add(1) launchFunc(wg, my_func)
Das obige ist der detaillierte Inhalt vonWie übergebe ich WaitGroup an einen sequentiellen Funktionsaufruf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!