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

Wie kann ich die Ausführungsreihenfolge von Go-Routinen steuern?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-13 21:59:31248Durchsuche

How Can I Control the Execution Order of Go Routines?

Go-Routine-Ausführungsreihenfolge

Dieser Code veranschaulicht das Konzept der Go-Routine-Ausführungsreihenfolge, bei der zwei gleichzeitige „Go“-Routinen oder Goroutinen vorhanden sind , werden gleichzeitig ausgeführt, jedoch ohne garantierte Reihenfolge.

Der Code definiert eine Summenfunktion, die ein ganzzahliges Array und einen Kanal als annimmt Eingänge. Diese Funktion berechnet die Summe der Ganzzahlen im Array und sendet das Ergebnis an den bereitgestellten Kanal.

In der Hauptfunktion wird ein Kanal c erstellt, um die Kommunikation zwischen den Goroutinen zu erleichtern. Es werden zwei Goroutinen gestartet, die jeweils die Summenfunktion mit unterschiedlichen Eingabearrays ausführen und das Ergebnis an c senden.

Das Programm empfängt dann die von den Goroutinen gesendeten Werte von Kanal c und gibt sie aus. Allerdings ist die Reihenfolge, in der die Goroutinen abgeschlossen werden, nicht deterministisch, sodass die Ausgabereihenfolge variieren kann.

Um die Ausführungsreihenfolge von Goroutinen zu steuern, können Sie verschiedene Mechanismen wie Blockierungskanäle oder Synchronisierungsprimitive verwenden, die vom Standard bereitgestellt werden Bibliothek. Hier ein paar Beispiele:

1. Kanäle blockieren:

In dieser modifizierten Version werden die Goroutinen nacheinander ausgeführt, indem die Hauptroutine blockiert wird, bis ein Wert vom Kanal empfangen wird:

func main() {
    c := make(chan int)

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

    // Block until a value is received from c
    x := <-c
    fmt.Println(x)

    go sum([]int{4, 5, 6}, c)

    // Block until a value is received from c
    x = <-c
    fmt.Println(x)
}

2. Wartegruppe mit Kanälen:

Eine weitere Option besteht darin, eine Wartegruppe und einen Bereich über den Kanal zu verwenden, um sicherzustellen, dass alle Goroutinen die Ausführung abgeschlossen haben, bevor die Ergebnisse verarbeitet werden:

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

    wg.Add(1)
    go sum([]int{1, 2, 3}, c, wg)
    wg.Wait()

    wg.Add(1)
    go sum([]int{4, 5, 6}, c, wg)
    wg.Wait()

    close(c)

    for x := range c {
        fmt.Println(x)
    }
}

Mit diesen Techniken können Sie die Ausführungsreihenfolge von Goroutinen steuern, um das gewünschte Verhalten in Ihren gleichzeitigen Programmen zu erreichen.

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

Stellungnahme:
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