HTTP ハンドラーでのゴルーチンの実行
Go では、HTTP ハンドラーはゴルーチンを使用して非同期タスクを実行することがよくあります。ただし、ハンドラーが応答を返した後にこれらのゴルーチンが完了するかどうかは不明です。
次のコードを考えてみましょう:
package main import ( "fmt" "net/http" "time" ) func worker() { fmt.Println("worker started") time.Sleep(time.Second * 10) fmt.Println("worker completed") } func HomeHandler(w http.ResponseWriter, r *http.Request) { go worker() w.Write([]byte("Hello, World!")) } func main() { http.HandleFunc("/home", HomeHandler) http.ListenAndServe(":8081", nil) }
ワーカー ゴルーチンは、応答が書き込まれた後のすべての状況で完了しますか?のclient?
答え:
ワーカー goroutine は、すべての通常のケースで完了します。完了を防ぐ唯一の方法は、プログラムを終了するか (main() から戻るか、致命的なエラーが発生することによって)、メモリを使い果たすことです。
一般的な HTTP 要求と応答のシナリオでは、ハンドラー関数 (この場合、HomeHandler) は、クライアントに応答を書き込んだ後に戻ります。ただし、プログラムはすぐには終了しません。ワーカー関数を実行するゴルーチンは、完了するかエラーが発生するまで実行を続けます。
HTTP サーバーの起動を担当する main() 関数は、プログラムが終了するまで実行を続けます。したがって、ワーカー ゴルーチンは、応答がいつクライアントに送信されるかに関係なく、実行を完了するのに十分な時間があります。
結論として、最初は直観に反するように思えるかもしれませんが、HTTP ハンドラー内で開始されたゴルーチンは、HTTP ハンドラー内で開始されたゴルーチンは、プログラムが異常終了するかメモリが不足しない限り、応答が返されます。これにより、ハンドラーによる応答の送信をブロックすることなく、非同期タスクを実行できます。
以上がGo の HTTP ハンドラーのゴルーチンは常に応答後に完了しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。