中斷Go 例程執行(*TCPListener)Accept
在Go 中建立TCP 伺服器時,您可能會遇到優雅的挑戰關閉伺服器並中斷goroutine 處理func (*TCPListener) Accept。
在 Go 中, func (*TCPListener) Accept 會阻塞執行,直到收到連線。要中斷這個goroutine,你應該:
關閉net.Listener:
中斷Accept goroutine的關鍵是關閉從net取得的net.Listener。聽(...)。透過關閉監聽器,您向作業系統發出訊號,表示不再接收連接,從而導致 Accept goroutine 退出。
從 Goroutine 回傳:
關閉後監聽者,確保你的 goroutine 回來。如果 Goroutine 在 Accept 呼叫之後有程式碼,它將繼續執行,並可能導致意外的行為或錯誤。
範例程式碼:
<code class="go">package main import ( "fmt" "net" ) func main() { ln, err := net.Listen("tcp", ":8080") if err != nil { // Handle error } go func() { for { conn, err := ln.Accept() if err != nil { if err == net.ErrClosed { return // Listener was closed } // Handle other errors } // Handle connection conn.Close() } }() fmt.Println("Press enter to stop...") var input string fmt.Scanln(&input) ln.Close() // Close the listener, interrupting the Accept loop }</code>
此程式碼建立一個TCPListener 在連接埠 8080 上啟動一個 goroutine,以無限循環的方式處理傳入連線。當使用者按下 Enter 鍵時,程式將關閉監聽器並中斷阻塞的 Accept 調用,導致 goroutine 返回。
以上是如何優雅地關閉 Go TCP 伺服器並中斷 `(*TCPListener) Accept` Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!