質問:
提供されたコード例では、ゴルーチンはHTTP ハンドラー (HomeHandler)、サーバーが応答した後でもゴルーチンは常に実行を完了しますか?クライアントへの応答?
コード例:
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) }
答え:
はい、ゴルーチンはワーカーで開始されましたあらゆる状況で実行を完了します。
Goroutine は、 Go プログラムは、main 関数や HTTP ハンドラーの実行によって制約されません。これらは、エラーが発生するか明示的に終了されない限り、並行して実行され続けます。この場合、ワーカー ゴルーチンは非同期で開始され、HomeHandler 関数はクライアントに応答を書き込んだ直後に戻ります。ハンドラー関数が戻り、サーバーが応答を送信した後でも、ワーカー goroutine は 10 秒間スリープして完了メッセージを出力するタスクを終了するまで実行を続けます。
Goroutine が完了しない可能性がある唯一のシナリオ
以上がHTTP ハンドラーで起動されたゴルーチンは、応答が送信された後に必ず終了しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。