在 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中文网其他相关文章!