ホームページ > バックエンド開発 > Golang > HTTP ハンドラーで起動されたゴルーチンは、応答が送信された後に必ず終了しますか?

HTTP ハンドラーで起動されたゴルーチンは、応答が送信された後に必ず終了しますか?

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

Will a Goroutine Launched in an HTTP Handler Always Finish After the Response is Sent?

HTTP ハンドラー内でのゴルーチンの実行

質問:

提供されたコード例では、ゴルーチンは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 が完了しない可能性がある唯一のシナリオ

  • main 関数が終了してプログラム全体を終了する場合。
  • プログラムが終了する場合メモリ不足などの致命的なエラーが発生しました。

以上がHTTP ハンドラーで起動されたゴルーチンは、応答が送信された後に必ず終了しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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