Kanalausgabereihenfolge in Golang verstehen
Betrachten Sie das folgende Golang-Programm:
func main() { messages := make(chan string) go func() { messages <- "hello" }() go func() { messages <- "ping" }() msg := <-messages msg2 := <-messages fmt.Println(msg) fmt.Println(msg2) }
Dieses Programm umfasst zwei Goroutinen asynchrones Schreiben in einen Kanal und Lesen durch die Hauptroutine vom selben Kanal. Trotz der ungepufferten Natur des Kanals gibt die Ausgabe immer „Ping“ und dann „Hallo“ aus.
Um die Gründe für diese Ausgabe zu verstehen, ist es wichtig zu verstehen, dass die Reihenfolge der Kanalausgabe nicht auf der Reihenfolge in basiert in dem die Goroutinen erstellt werden. Stattdessen wird es vom Scheduler bestimmt, der auf nichtdeterministische Weise über die Ausführungsreihenfolge von Goroutinen entscheidet.
Wenn das Programm ausgeführt wird, laufen die beiden Goroutinen, die für das Senden von Nachrichten an den Kanal verantwortlich sind, gleichzeitig. Da der Kanal ungepuffert ist, blockieren beide Goroutinen, bis ein Empfänger verfügbar wird.
Wenn die Hauptroutine versucht, mit msg := <-messages vom Kanal zu lesen, gewährt der Scheduler Zugriff auf eine der wartenden Goroutinen . Diese Goroutine sendet erfolgreich eine Nachricht an den Kanal, die dann von der Hauptroutine empfangen und msg zugewiesen wird.
Anschließend, wenn die Hauptroutine erneut versucht, mit msg2 := <-messages vom Kanal zu lesen , wählt der Scheduler die verbleibende Goroutine aus und erlaubt ihr, ihre Nachricht an den Kanal zu senden. Die Nachricht wird dann von der Hauptroutine abgerufen und msg2 zugewiesen.
In diesem speziellen Fall wählt der Scheduler konsequent die Goroutine aus, die „Ping“ sendet, als erste, die ihre Nachricht sendet. Es ist jedoch wichtig zu beachten, dass dieses Ergebnis nicht deterministisch ist und sich aufgrund von Faktoren wie Systemlast und Ausführungsumgebung ändern kann.
Zusammenfassend ist die Ausgabereihenfolge in Golang-Kanälen nicht garantiert und unterliegt der Ausführungsreihenfolge des Planers für Goroutinen. Daher kann die Ausgabe trotz der Einfachheit dieses Beispiels bei verschiedenen Ausführungen variieren.
Das obige ist der detaillierte Inhalt vonWarum gibt dieses Go-Programm trotz gleichzeitiger Kanalschreibvorgänge erst „ping' und dann „hello' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!