あなたは、コマンドライン用に最適化されていない 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) を呼び出しているために発生します。複数回:
呼び出しサーバーがまだ接続をリッスンしている間に 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 サイトの他の関連記事を参照してください。