在 Go 中,Listen.Accept 函數會阻塞執行,直到連線被接受。這使得優雅地停止偵聽伺服器變得困難,因為您無法區分錯誤和關閉連線之間的差異。
一種解決方案是使用完成通道來指示伺服器何時應停止偵聽。這允許您關閉偵聽套接字而不會出現錯誤。
以下是如何執行此操作的範例:
// 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 }
此程式碼使用完成通道來指示伺服器何時應該別再聽了。當呼叫 stop 方法時,它會向 did 通道發送一個值,這會導致serve方法退出。
這允許您優雅地停止偵聽伺服器而不會出現錯誤。
以上是如何優雅地停止 Go 監聽伺服器而不出錯?的詳細內容。更多資訊請關注PHP中文網其他相關文章!