Priorisierung der Fallauswahl in Go
In der Select-Anweisung von Go ist die Reihenfolge der Fallauswertung nicht deterministisch, was zu möglichen Inkonsistenzen bei der Verarbeitung des Kontexts führt Stornoereignisse rechtzeitig abzuwickeln. Ein häufiges Szenario beinhaltet eine Hintergrundroutine, die regelmäßige Heartbeats sendet, die sofort anhalten sollten, wenn der Kontext abgebrochen wird. Aufgrund der unvorhersehbaren Auswahlreihenfolge ist es jedoch möglich, das Senden von Heartbeats auch nach der Kontextaufhebung zu beobachten.
Um die sofortige Beendigung von Heartbeats bei der Kontextaufhebung sicherzustellen, ist ein robusterer Ansatz erforderlich. Anstatt sich auf die Reihenfolge der Fallauswertung zu verlassen, besteht die bevorzugte Methode darin, den Kontextaufhebungsfall explizit zu priorisieren. Dies kann durch die Verwendung einer verschachtelten Select-Anweisung mit der gewünschten Priorität erreicht werden: Der Kontextaufhebungsfall sollte in einer äußeren Select-Anweisung platziert werden, gefolgt von einer zweiten Select-Anweisung, die die Heartbeat-Funktionalität verwaltet.
Beachten Sie den folgenden geänderten Code :
func sendRegularHeartbeats(ctx context.Context) { ticker := time.NewTicker(time.Second) defer ticker.Stop() for { //outer select, giving priority to context cancellation select { case <-ctx.Done(): return default: } //inner select for heartbeat functionality select { case <-ctx.Done(): return case <-ticker.C: sendHeartbeat() } } }
Indem wir den Heartbeat-Handling-Fall in einer äußeren Select-Anweisung verschachteln, priorisieren wir effektiv den Fall der Kontextaufhebung und stellen so seine sofortige Ausführung sicher, wenn der Kontext abgebrochen wird. Dadurch wird die Möglichkeit ausgeschlossen, dass nach dem Aufheben des Kontexts Heartbeats gesendet werden, wodurch das gewünschte Verhalten gewährleistet wird.
Das obige ist der detaillierte Inhalt vonWie kann ich eine rechtzeitige Kontextaufhebung in der „select'-Anweisung von Go garantieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!