首頁 >後端開發 >Golang >如何優雅地停止 Go 監聽伺服器而不出錯?

如何優雅地停止 Go 監聽伺服器而不出錯?

Susan Sarandon
Susan Sarandon原創
2024-12-10 00:26:11687瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn