ホームページ > バックエンド開発 > Golang > 偽のエラーを発生させずに Go リスニング サーバーを正常に停止するにはどうすればよいですか?

偽のエラーを発生させずに Go リスニング サーバーを正常に停止するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-12 18:59:10
オリジナル
842 人が閲覧しました

How Can I Gracefully Stop a Go Listening Server Without Spurious Errors?

Go でのリスニング サーバーの正常な停止

バックグラウンド

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート