ホームページ > バックエンド開発 > Golang > 応答を返した後に HTTP サーバーを正常にシャットダウンするにはどうすればよいですか?

応答を返した後に HTTP サーバーを正常にシャットダウンするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-29 09:10:02
オリジナル
1033 人が閲覧しました

How to Gracefully Shut Down an HTTP Server After Returning a Response?

応答を返した後に HTTP サーバーをシャットダウンします

あなたは、コマンドライン用に最適化されていない OAuth を使用して Instagram API と対話するコマンドライン ボットを開発しています。アプリケーション。これを解決するには、承認用のリダイレクト URI としてローカル HTTP サーバーを設定しました。ユーザーがアプリケーションを承認し、サーバーにリダイレクトされた後、アクセス トークンが表示されたらサーバーをシャットダウンしたいと考えています。

シャットダウン メカニズムの実装時に問題が発生しました。具体的には、リクエスト ハンドラー (showTokenToUser) で srv.Shutdown(nil) を呼び出すとエラーが発生します。

2017/11/23 16:02:03 Httpserver: ListenAndServe() error: http: Server closed
2017/11/23 16:02:03 http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference
ログイン後にコピー

解決策

この問題は、srv.Shutdown(nil) を呼び出しているために発生します。複数回:

  1. クロージャ内にある showTokenToUser ハンドラー内。
  2. ハンドラーが main 関数で実行を終了した後。

呼び出しサーバーがまだ接続をリッスンしている間に srv.Shutdown を実行すると、競合状態が発生します。 ListenAndServe() ゴルーチンは、開いているリスナーとアイドル状態の接続を閉じようとしますが、ハンドラー クロージャでの後続の Shutdown 呼び出しによって中断されます。この状態の不一致によりパニックが引き起こされます。

この問題を解決するには、次の 2 つの方法のいずれかを使用できます。

1. context.WithCancel を使用します:

このアプローチでは、キャンセル関数を備えた context.Context を作成します。コンテキストは、ListenAndServe ゴルーチンと showTokenToUser ハンドラー関数に渡されます。ハンドラー内で、アクセス トークンがユーザーに表示されたら、cancel 関数を呼び出してコンテキストを終了します。 ListenAndServe ゴルーチンは、コンテキストがキャンセルされるとサーバーを正常にシャットダウンします。

2.同じ Context を使用します:

context.WithCancel を呼び出す代わりに、同じ context.Context を ListenAndServe ゴルーチンとハンドラー関数に渡すことができます。アクセス トークンが表示されたら、コンテキストで cancel() を呼び出します。これにより、ハンドラーと ListenAndServe ゴルーチンの両方のシャットダウンがトリガーされます。

いずれかのアプローチを実装した後は、srv.Shutdown 関数を待つことを忘れないでください。プログラムを終了する前に完了してください。

以上が応答を返した後に HTTP サーバーを正常にシャットダウンするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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