Go の HTTP ハンドラーのゴルーチンは常に応答後に完了しますか?

Barbara Streisand
リリース: 2024-11-27 13:15:13
オリジナル
129 人が閲覧しました

Do Goroutines in Go's HTTP Handlers Always Complete After the Response?

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 サイトの他の関連記事を参照してください。

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