首頁 > 後端開發 > Golang > 如何優雅地關閉 Go TCP 伺服器並中斷 `(*TCPListener) Accept` Goroutine?

如何優雅地關閉 Go TCP 伺服器並中斷 `(*TCPListener) Accept` Goroutine?

Patricia Arquette
發布: 2024-11-03 07:27:02
原創
809 人瀏覽過

How to Gracefully Shut Down a Go TCP Server and Interrupt the `(*TCPListener) Accept` Goroutine?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板