In Go blockiert die Listen.Accept-Funktion die Ausführung, bis eine Verbindung akzeptiert wird. Dies macht es schwierig, einen lauschenden Server ordnungsgemäß zu stoppen, da Sie den Unterschied zwischen einem Fehler und einer geschlossenen Verbindung nicht erkennen können.
Eine Lösung besteht darin, einen fertigen Kanal zu verwenden, um zu signalisieren, wann der Server aufhören soll zu lauschen. Dadurch können Sie den Listening-Socket schließen, ohne eine Fehlermeldung zu erhalten.
Hier ist ein Beispiel dafür:
// Echo server struct type EchoServer struct { listen net.Listener done chan bool } // Listen for incoming connections 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)) } } // Stop the server by closing the listening listen func (es *EchoServer) stop() { es.done <- true // We can advance past this because we gave it buffer of 1 es.listen.Close() // Now it the Accept will have an error above }
Dieser Code verwendet einen fertigen Kanal, um zu signalisieren, wann der Server sollte Hör auf zuzuhören. Wenn die Stop-Methode aufgerufen wird, sendet sie einen Wert an den Fertigkanal, wodurch die Serve-Methode beendet wird.
Dadurch können Sie einen lauschenden Server ordnungsgemäß stoppen, ohne dass eine Fehlermeldung angezeigt wird.
Das obige ist der detaillierte Inhalt vonWie kann ich einen Go-Listening-Server ordnungsgemäß und ohne Fehler stoppen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!