首页 > 后端开发 > Golang > 如何优雅地停止 Go 监听服务器而不出错?

如何优雅地停止 Go 监听服务器而不出错?

Susan Sarandon
发布: 2024-12-10 00:26:11
原创
692 人浏览过

How to Gracefully Stop a Go Listening Server Without Errors?

如何在 Go 中优雅地停止监听服务器

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板