In Go ist das ordnungsgemäße Stoppen eines lauschenden Servers unerlässlich, um eine abrupte Beendigung und möglichen Datenverlust zu vermeiden . Eine Herausforderung besteht darin, den spezifischen Fehler zu erkennen, der darauf hinweist, dass der Listener geschlossen wurde, da er nicht explizit in die Standardbibliothek exportiert wird.
Um dieses Problem zu beheben, können wir den Kanal „Done“ nutzen signalisieren das bevorstehende Herunterfahren des Servers.
Die geänderte Funktion „serve()“ behandelt jetzt Fehler anders:
func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // If we called stop() then there will be a value in es.done, so // we'll get here and we can exit without showing the error. default: log.Printf("Accept failed: %v", err) } return } go es.respond(conn.(*net.TCPConn)) } }
Die geänderte stop()-Methode sendet jetzt ein Signal an den Fertig-Kanal, bevor der Listener geschlossen wird:
// Stop the server by closing the listening listen func (es *EchoServer) stop() { es.done <- true // We can advance past this because we gave it a buffer of 1 es.listen.Close() // Now the Accept will have an error above }
Dieser Ansatz bietet eine verbesserte und elegante Möglichkeit, mit Serverstopps in Go umzugehen. Durch die Nutzung des Fertig-Kanals können wir die Anzeige unerwünschter Fehlermeldungen verhindern und gleichzeitig die Kontrolle über die Serverbeendigung behalten.
Das obige ist der detaillierte Inhalt vonWie kann ich einen Go-Server ordnungsgemäß stoppen und Fehler „Verwendung einer geschlossenen Netzwerkverbindung' vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!