HTTP ハンドラーでの goroutine の実行
HTTP ハンドラー内で goroutine を使用する場合、応答を返した後の完了ステータスが気になるのは自然なことです。 。提供されているコード例を見てみましょう:
// Handler that starts a goroutine func HomeHandler(w http.ResponseWriter, r *http.Request) { go worker() // Starts a goroutine called "worker" w.Write([]byte("Hello, World!")) // Sends a response to the client }
疑問が生じます: HTTP 応答が送信された後でも、「ワーカー」ゴルーチンは常に完了しますか?
答え
はい、「ワーカー」ゴルーチンはあらゆる状況で完了します。その理由は次のとおりです。
ゴルーチンは、メイン プログラムと同時に実行される軽量のスレッドです。 go で goroutine を開始すると、それにスタックが割り当てられ、実行がプリエンプトされます。ゴルーチンが作成されると、現在の関数 (この場合は HomeHandler) が戻った後でも、メイン プログラムから独立して実行されます。
提供された例では、ゴルーチンは go ワーカーの直後に実行を開始します。 () ライン。開始を示すメッセージを出力し、完了メッセージを出力する前に 10 秒間スリープします。
ゴルーチンの実行中、HomeHandler 関数は実行を継続し、クライアントに応答を送信します。その後、サーバーはリクエストを完了としてマークし、リスナーに戻り、さらなるリクエストを待ちます。
「ワーカー」ゴルーチンはハンドラーから独立しているため、HTTP 応答が送信された後でも実行を続けます。オペレーティング システムのスケジューラにより、他のゴルーチンと CPU を共有できるようになり、最終的にはスリープが完了し、完了メッセージが表示されます。
例外的なケース
があります。 goroutine が使用できないいくつかの例外的なケースのみ完了:
ただし、例で提供されているような安定した適切に作成されたプログラムでは、ゴルーチンはタスクを正常に完了することが期待されます。
以上がHTTP ハンドラーのゴルーチンは常に応答の送信後に完了しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。