首頁 >後端開發 >Golang >如何優雅地停止 Go 伺服器並避免'使用關閉的網路連接”錯誤?

如何優雅地停止 Go 伺服器並避免'使用關閉的網路連接”錯誤?

Susan Sarandon
Susan Sarandon原創
2024-12-12 11:28:09337瀏覽

How Can I Gracefully Stop a Go Server and Avoid

在Go 中優雅地處理伺服器停止

問題介紹

在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))
  }
}
  • done 通道允許我們在關閉監聽器之前向serve()函數發送一個訊號。
  • 當 stop() 被呼叫時,它會傳送一個訊號值為done,它會解除對serve()中的select語句的阻塞。
  • 這確保了當監聽器關閉時,serve()函數優雅地退出而不報告「使用關閉的網路連線」錯誤。

更新了Stop 方法

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

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