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