ホームページ >バックエンド開発 >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 関数は、接続が受け入れられるまで実行をブロックします。このため、エラーと閉じられた接続の違いが分からないため、リスニング サーバーを正常に停止することが困難になります。

解決策の 1 つは、done チャネルを使用して、サーバーがリスニングを停止するタイミングを通知することです。これにより、エラーを発生させずに待機中のソケットを閉じることができます。

これを行う方法の例を次に示します。

// 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
}

このコードは、done チャネルを使用して、サーバーがいつ終了すべきかを通知します。聞くのをやめてください。 stop メソッドが呼び出されると、done チャネルに値が送信され、serve メソッドが終了します。

これにより、エラーを発生させることなく、リスニング サーバーを正常に停止できます。

以上がGo リスニング サーバーをエラーなしで正常に停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。