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) } }
はい、これは理にかなっていると思います。実際、defer cancel()
を使用する目的は、リリースのために cancel 関数が確実に呼び出されるようにすることです。リソースに関連付けられたコンテキスト。関数がどのように終了しても、あなたの例では cancel()
関数は http.HandlerFunc
が完了するまで、またはコンテキストが完了するまで延期されるため、 go func ()
は、提供されたコンテキストを使用して match_route.handler
関数を実行し、次に cancel()
を呼び出してコンテキストを明示的にキャンセルします。 #select ステートメントはコンテキストの完了を待機するために使用されます。期限を超えてコンテキストが完了した場合は、エラー応答が返されます。
以上がこれは defer cancel() を使用する意味がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。