Go でのサーバーのシャットダウンの管理
Go では、クライアント接続を適切に処理し、予期しないエラーを防ぐために、リスニング サーバーのシャットダウンを管理することが不可欠です。 。この記事では、リスニング サーバーを停止する際の課題に対処し、それを達成するための堅牢なアプローチを紹介します。
課題の特定
サーバーが受信接続をリッスンするとき、Accept はメソッドは、接続が確立されるかエラーが発生するまでブロックされます。このブロック動作は接続を継続的に受け入れる場合には便利ですが、サーバーを正常に停止する必要がある場合には課題が生じます。操作の終了を通知するためにリッスンしているソケットを閉じると、他の Accept エラーと区別できないエラーが発生する可能性があります。
「FIXME」の問題
提供されたコードでは、 serve メソッドは、リッスンしているソケットが閉じられているときに「閉じられたネットワーク接続の使用」エラーを検出しようとしますが、このエラーはネット パッケージからエクスポートされません。この制限により、醜いエラー処理手法に依存せずにサーバーのシャットダウンを適切に処理することが困難になります。
より良いアプローチ
この問題に対処するには、より効果的なアプローチが必要です。専用チャネル (完了) を使用して、サーバーの停止の意図を通知します。 stop メソッドが呼び出されると、done チャネルに値が送信されます。
serve メソッド内で、Accept エラーをログに記録する前に、done チャネル内の信号の存在をチェックするように Accept ループが変更されます。シグナルが存在する場合、Accept エラーは抑制されます。
サンプル コード
以下の変更されたコード スニペットは、このアプローチがどのように実装されるかを示しています。
// Serve method 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 method 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 チャネルを使用すると、サーバーは、serve メソッドにシグナルを送信してシャットダウンを適切に処理でき、「閉じたネットワーク接続の使用」エラーが抑制されます。クリーンなシャットダウンを保証します。
以上がGo サーバーを正常にシャットダウンし、「閉じられたネットワーク接続の使用」エラーを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。