Das Netzpaket von Go bietet die Möglichkeit, Listening-Server zu erstellen. Das ordnungsgemäße Stoppen dieser Server kann jedoch aufgrund der blockierenden Natur der listen.Accept-Methode eine Herausforderung darstellen.
Ein gängiger Ansatz zum Stoppen eines Servers besteht darin, den Listening-Socket zu schließen. Allerdings kann es dabei zu Fehlern kommen, die von echten Fehlern bei der Verbindungsannahme nicht zu unterscheiden sind. Daher zeigt das folgende Code-Snippet dieses Problem:
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() // FIXME: I'd like to detect "use of closed network connection" here // FIXME: but it isn't exported from net if err != nil { log.Printf("Accept failed: %v", err) break } // ... } // ... }
Um diese Einschränkung zu beheben, können wir den es.done-Kanal verwenden, um ein Signal zu senden, bevor der Server es tut gestoppt. So kann der Code verbessert werden:
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // Server is being stopped, so we can exit without logging the error. default: log.Printf("Accept failed: %v", err) } return } // ... } } // Stop the server by closing the listening socket func (es *EchoServer) stop() { es.done <- true es.listen.Close() }
Durch das Senden eines Werts an den es.done-Kanal vor dem Schließen des Listening-Sockets kann die Serve-Funktion feststellen, wann der Server gestoppt wird, und ordnungsgemäß beendet werden, ohne dass eine falsche Protokollierung erfolgt Fehler.
Das obige ist der detaillierte Inhalt vonWie kann ich einen Go-Listening-Server ordnungsgemäß und ohne falsche Fehler stoppen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!