Go の net パッケージは、リスニング サーバーを作成する機能を提供します。ただし、listen.Accept メソッドのブロック特性により、これらのサーバーを正常に停止するのは困難な場合があります。
サーバーを停止する一般的なアプローチの 1 つは、リスニング ソケットを閉じることです。ただし、これにより、接続の受け入れ時に本物のエラーと区別できないエラーが発生する可能性があります。その結果、次のコード スニペットでこの問題が発生します。
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() // FIXME: I'd like to detect "use of closed network connection" here // FIXME: but it isn't exported from net if err != nil { log.Printf("Accept failed: %v", err) break } // ... } // ... }
この制限に対処するには、サーバーが停止する前に es.done チャネルを利用してシグナルを送信します。止まった。コードをどのように改善できるかは次のとおりです。
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // Server is being stopped, so we can exit without logging the error. default: log.Printf("Accept failed: %v", err) } return } // ... } } // Stop the server by closing the listening socket func (es *EchoServer) stop() { es.done <- true es.listen.Close() }
リスニング ソケットを閉じる前に es.done チャネルに値を送信することで、serve 関数はサーバーがいつ停止されるかを判断し、偽のログを記録せずに正常に終了できます。エラー。
以上が偽のエラーを発生させずに Go リスニング サーバーを正常に停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。