提供されたコードでは、findCicCode() 関数の結果またはタイムアウトを処理する select ステートメントを使用してタイムアウト メカニズムを実装しました。 50ミリ秒。ただし、タイムアウト後も HTTP 呼び出しが実行され続ける場合、リソース漏洩の可能性について懸念を表明しました。
この問題に対処するには、 Go におけるコンテキストの概念。コンテキストは、コンテキスト固有の値をゴルーチンに関連付ける方法を提供し、キャンセルを可能にします。コンテキストを使用すると、タイムアウトが発生したときに進行中の HTTP 呼び出しをキャンセルできます。
HTTP リクエストのコンテキスト キャンセルを実装する方法の例を次に示します。
<code class="go">package main import ( "context" "fmt" "net/http" "time" ) type Response struct { data interface{} status bool } func Find() (interface{}, bool) { ch := make(chan Response, 1) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() // Ensure cancelation when the function exits go func() { data, status := findCicCode(ctx) ch <- Response{data: data, status: status} }() select { case response := <-ch: return response.data, response.status case <-time.After(50 * time.Millisecond): return "Request timed out", false } } func main() { data, timedOut := Find() fmt.Println(data, timedOut) }</code>
この変更されたコードでは、
このアプローチを使用すると、タイムアウトに達したときに進行中の HTTP リクエストが確実にキャンセルされ、不必要なリソースの消費が防止されます。
以上がタイムアウトが発生したときに Go で HTTP リクエストを効果的にキャンセルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。