在 Go 中,优雅地停止监听服务器对于避免突然终止和潜在的数据丢失至关重要。一项挑战是识别指示侦听器已关闭的特定错误,因为它未在标准库中显式导出。
要解决此问题,我们可以利用 did 通道来发出服务器即将关闭的信号。
修改后的serve()函数现在可以处理错误不同的是:
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() 方法现在在关闭侦听器之前向完成通道发送信号:
// 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 }
这种方法提供了一种改进且优雅的方式来处理 Go 中的服务器停止。通过利用完成通道,我们可以防止显示不需要的错误消息,同时仍然保持对服务器终止的控制。
以上是如何优雅地停止 Go 服务器并避免'使用关闭的网络连接”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!