Kanalausgabereihenfolge in Golang verstehen
In Golang bieten ungepufferte Kanäle einen zuverlässigen Kommunikationsmechanismus zwischen Goroutinen. Allerdings kann ihre Ausgabereihenfolge manchmal verwirrend sein. Betrachten Sie den folgenden Code:
func main() { messages := make(chan string) go func() { messages <- "hello" }() go func() { messages <- "ping" }() msg := <-messages msg2 := <-messages fmt.Println(msg) fmt.Println(msg2) }
Beim Ausführen dieses Codes wird stets „ping“ gefolgt von „hello“ ausgegeben. Dies mag kontraintuitiv erscheinen, da man erwarten könnte, dass die Ausgabe mit der Reihenfolge übereinstimmt, in der die Goroutinen erstellt wurden.
Um zu verstehen, warum dies geschieht, ist es wichtig, sich daran zu erinnern, dass Kanäle Kommunikationspipelines sind, während Goroutinen parallele Aufgaben darstellen. Die Ausführungsreihenfolge von Goroutinen ist nicht garantiert, selbst wenn sie in einer bestimmten Reihenfolge erstellt wurden.
In diesem Fall hat der Planer möglicherweise die Goroutine, die „Ping“ sendet, vor der Goroutine geplant, die „Hallo“ sendet. Wenn der erste Empfänger (d. h. msg := <-messages) verfügbar wird, akzeptiert er die Nachricht von der bereits geplanten „Ping“-Goroutine.
Nach dem Empfang der ersten Nachricht wird das Programm mit der Ausführung fortfahren bis der zweite Empfänger (msg2 := <-messages) verfügbar wird. Zu diesem Zeitpunkt ist die „Hallo“-Nachricht zum Senden bereit und wird als zweite Nachricht akzeptiert.
Daher wird die Ausgabereihenfolge durch die Ausführungsreihenfolge der Goroutinen bestimmt, die in den Kanal schreiben , nicht die Reihenfolge, in der sie erstellt werden, oder die Reihenfolge, in der die Nachrichten vom Kanal gelesen werden. Um dies zu überprüfen, kann man den Goroutinen eine Println-Anweisung hinzufügen, wie in der bereitgestellten Antwort vorgeschlagen:
... func() { messages <- "hello"; fmt.Println("Hello sent") }() func() { messages <- "ping"; fmt.Println("Ping sent") }() ...
Dies gibt Folgendes aus:
Hello sent Ping sent ping hello
Dies bestätigt, dass die Nachrichten gesendet wurden und in der gleichen Reihenfolge gedruckt.
Das obige ist der detaillierte Inhalt vonWarum erscheint Golangs ungepufferte Kanalausgabereihenfolge kontraintuitiv?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!