ホームページ > バックエンド開発 > Golang > これは defer cancel() を使用する意味がありますか?

これは defer cancel() を使用する意味がありますか?

王林
リリース: 2024-02-12 13:45:06
転載
909 人が閲覧しました

这对于 defer cancel() 有意义吗?

質問内容

http.HandlerFuncでこんなことが分かりました。しかし、私の質問は、タイムアウトコンテキストを適用した後に defer cancel() を置くのは意味があるのか​​ということです。

なぜなら、一番下の選択はコンテキストが完了するまでリッスンし続けるからです。そして、遅延はコンテキストが完了した後に実行されます。しかし、それは終わったでしょうか? :)

//  Apply timeout context
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, time.Duration(time.Duration(match_route.timeout) * time.Second))
defer cancel() // <--- does this make sense

go func(){
    match_route.handler(w, r.WithContext(ctx))
    cancel()
}()

select {
case <-ctx.Done():
    if ctx.Err() == context.DeadlineExceeded {
        http.Error(w, "Timeout", http.StatusRequestTimeout)
    }
}
ログイン後にコピー

Solution

はい、これは理にかなっていると思います。実際、defer cancel() を使用する目的は、リリースのために cancel 関数が確実に呼び出されるようにすることです。リソースに関連付けられたコンテキスト。関数がどのように終了しても、あなたの例では cancel() 関数は http.HandlerFunc が完了するまで、またはコンテキストが完了するまで延期されるため、 go func () は、提供されたコンテキストを使用して match_route.handler 関数を実行し、次に cancel() を呼び出してコンテキストを明示的にキャンセルします。 #select ステートメントはコンテキストの完了を待機するために使用されます。期限を超えてコンテキストが完了した場合は、エラー応答が返されます。

以上がこれは defer cancel() を使用する意味がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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