Heim >Backend-Entwicklung >Golang >Wie verwende ich sync.WaitGroup, um alle Goroutinen auszuführen?

Wie verwende ich sync.WaitGroup, um alle Goroutinen auszuführen?

PHPz
PHPznach vorne
2024-02-09 11:40:09777Durchsuche

Wie verwende ich sync.WaitGroup, um alle Goroutinen auszuführen?

PHP-Editor Apple stellt Ihnen eine praktische Methode zum Ausführen aller Goroutinen vor – sync.WaitGroup. In der Go-Sprache ist Goroutine ein leichter Thread, der mehrere Aufgaben gleichzeitig ausführen kann. Manchmal müssen wir jedoch warten, bis alle Goroutinen abgeschlossen sind, bevor wir mit dem nächsten Schritt fortfahren. Zu diesem Zeitpunkt ist sync.WaitGroup praktisch. Es bietet eine einfache und effektive Möglichkeit, auf den Abschluss aller Goroutinen zu warten und so die korrekte Ausführungsreihenfolge des Programms sicherzustellen. Als Nächstes stellen wir detailliert vor, wie sync.WaitGroup zum Implementieren dieser Funktion verwendet wird.

Frageninhalt

Derzeit schiebe ich alle Werte auf einen Kanal und lese daraus und berechne ihr Quadrat. Ich möchte die Verwendung von time.sleep(2000 * time.millisecond) vermeiden, da es die Ausführung für 2 Sekunden blockiert. Stattdessen möchte ich, dass jede Goroutine verarbeitet wird, auf ihre Ausführung wartet und dann das Programm beendet. Ich bin gerade von Golang weggezogen und stelle jetzt diese grundlegende Frage :(. Kann mir jemand bei der Lösung dieses Problems helfen?

package main

import (
    "fmt"
    "sync"
    "time"
)

func doSquare(num int) int {
    return num * num
}

var wg sync.WaitGroup

func main() {

    wg.Add(1)
    st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    quit := make(chan bool)
    ch := make(chan int)
    go func() {
        for i := range st {
            ch <- i
        }
    }()

    go func() {
        for {
            select {
            case x := <-ch:
                fmt.Println(doSquare(x))
                // return

            case <-quit:
                wg.Done()
            default:
                // fmt.Println("---")
                // do something
            }
        }
    }()

    quit <- true

    wg.Wait()
    time.Sleep(2000 * time.Millisecond)
}

Lösung

Gehen Sie einfach qui​​t zum Ende der ersten Goroutine

func main() {
    wg.add(1)
    st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    quit := make(chan bool)
    ch := make(chan int)
    go func() {
        for i := range st {
            ch <- i
        }
        quit <- true
    }()

    go func() {
        for {
            select {
            case x := <-ch:
                fmt.println(dosquare(x))
                // return

            case <-quit:
                wg.done()
                return
            default:
                // fmt.println("---")
                // do something
            }
        }
    }()

    wg.wait()
}

Das ist close(ch)eine andere Art zu sagen, dass es keine Daten mehr gibt

func main() {
    st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    quit := make(chan bool)
    ch := make(chan int) // improve concurrency by `ch := make(chan int, 100)`
    go func() {
        for i := range st {
            ch <- i
        }
        close(ch)
    }()

    go func() {
        for x := range ch {
            fmt.Println(doSquare(x))
        }
        quit <- true
    }()

    <-quit
}

Das obige ist der detaillierte Inhalt vonWie verwende ich sync.WaitGroup, um alle Goroutinen auszuführen?. 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