Heim  >  Artikel  >  Backend-Entwicklung  >  Wie übergebe ich WaitGroup an einen sequentiellen Funktionsaufruf?

Wie übergebe ich WaitGroup an einen sequentiellen Funktionsaufruf?

王林
王林nach vorne
2024-02-05 22:57:191044Durchsuche

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

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Typ aus Slice erstellenNächster Artikel:Typ aus Slice erstellen