Wie übergebe ich WaitGroup an einen sequentiellen Funktionsaufruf?

王林
Freigeben: 2024-02-05 22:57:19
nach vorne
1049 Leute haben es durchsucht

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

Frageninhalt

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()
}
Nach dem Login kopieren

Gibt es einen besseren Weg, dieses Ziel zu erreichen?


Richtige Antwort


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()
}()
Nach dem Login kopieren

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
}()
Nach dem Login kopieren

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()
    }()
}
Nach dem Login kopieren

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()
    }()
}
Nach dem Login kopieren

Mit dem oben genannten Helfer können Sie Folgendes tun:

wg.Add(1)
launchMyFunc(wg)

// or
wg.Add(1)
launchFunc(wg, my_func)
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage