Heim > Backend-Entwicklung > Golang > Warum gibt dieses Go-Programm trotz gleichzeitiger Kanalschreibvorgänge erst „ping' und dann „hello' aus?

Warum gibt dieses Go-Programm trotz gleichzeitiger Kanalschreibvorgänge erst „ping' und dann „hello' aus?

Barbara Streisand
Freigeben: 2024-12-16 05:16:14
Original
740 Leute haben es durchsucht

Why Does This Go Program Print

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)
}
Nach dem Login kopieren

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage