Heim > Backend-Entwicklung > Golang > Wie kann ich die Ausführungsreihenfolge von Goroutinen in Go steuern?

Wie kann ich die Ausführungsreihenfolge von Goroutinen in Go steuern?

DDD
Freigeben: 2024-12-29 18:55:10
Original
536 Leute haben es durchsucht

How Can I Control the Order of Execution of Goroutines in Go?

Unvorhersehbarkeit der Ausführungsreihenfolge von Goroutinen

Im bereitgestellten Codeausschnitt ist die Ausführungsreihenfolge für die beiden Goroutinen nicht deterministisch. Die Ausgabe zeigt, dass die zweite Goroutine zuerst ausgeführt wird, obwohl sie nach der ersten gestartet wurde. Dieses Verhalten ist auf die gleichzeitige Natur von Goroutinen zurückzuführen, was bedeutet, dass sie unabhängig voneinander ausgeführt werden.

Synchronisationsmechanismen in Goroutinen

Zur Steuerung der Reihenfolge der Goroutinenausführung , Sie können von Go bereitgestellte Synchronisierungsmechanismen verwenden, wie zum Beispiel:

Kanäle: Sie können Verwenden Sie Kanäle, um die Ausführung von Goroutinen zu synchronisieren. Ein Kanal ist ein Kommunikationskanal, der es Goroutinen ermöglicht, Daten zu senden und zu empfangen. Im modifizierten Beispiel unten wird der Kanal verwendet, um die Haupt-Goroutine zu blockieren, bis die erste Goroutine ihre Ausführung abschließt, bevor die zweite Goroutine gestartet wird.

func main() {

    c := make(chan int)

    go sum([]int{1, 2, 3}, c)

    // Use the channel to block until it receives a send
    x := <-c
    fmt.Println(x)

    // Then execute the next routine
    go sum([]int{4, 5, 6}, c)

    x = <-c
    fmt.Println(x)
}
Nach dem Login kopieren

Wartegruppen: Eine Wartegruppe ist ein weiterer Synchronisierungsmechanismus, mit dem Sie warten können, bis die Ausführung mehrerer Goroutinen abgeschlossen ist, bevor Sie fortfahren. Im folgenden Beispiel wird eine Wartegruppe verwendet, um sicherzustellen, dass alle Goroutinen abgeschlossen sind, bevor die Haupt-Goroutine beendet wird.

func sum(a []int, c chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Println("summing: ", a)
    total := 0
    for _, v := range a {
        total += v
    }
    // Send total to c
    c <- total
}

func main() {

    c := make(chan int)
    wg := new(sync.WaitGroup)

    // Concurrently call the concurrent calls to sum, allowing execution to continue to the range of the channel
    go func() {
        // Increment the wait group, and pass it to the sum func to decrement it when it is complete
        wg.Add(1)
        go sum([]int{1, 2, 3}, c, wg)
        // Wait for the above call to sum to complete
        wg.Wait()
        // And repeat...
        wg.Add(1)
        go sum([]int{4, 5, 6}, c, wg)
        wg.Wait()
        // All calls are complete, close the channel to allow the program to exit cleanly
        close(c)
    }()

    // Range of the channel
    for theSum := range c {
        x := theSum
        fmt.Println(x)
    }

}
Nach dem Login kopieren

Durch die Verwendung dieser Synchronisierungsmechanismen können Sie die Reihenfolge der Goroutine-Ausführung steuern und sicherstellen, dass die Die gewünschte Abfolge der Vorgänge wird eingehalten.

Das obige ist der detaillierte Inhalt vonWie kann ich die Ausführungsreihenfolge von Goroutinen in Go steuern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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