Goroutine Timeout
提供された関数 Find() は、Goroutine を使用して一連の HTTP リクエストを作成し、その応答を処理します。ただし、懸念されるのは、指定されたタイムアウトを超えても、これらのリクエストがバックグラウンドで継続されることです。
潜在的な Goroutine Leak
に goroutine リークがある可能性は低いです。コード。 Find() 関数がタイムアウトを返した場合、メインのゴルーチンは続行され、バックグラウンドのゴルーチンは基本的に破棄されます。
HTTP リクエストのキャンセル
タイムアウト後にリクエストが行われないようにするには、解決策は、HTTP リクエストごとに context.Context を使用することです。コンテキストを使用すると、タイムアウトが発生した場合にリクエストをキャンセルできます。
<code class="go">func Find() (interface{}, bool) { ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) defer cancel() ch := make(chan Response, 1) go func() { data, status := findCicCode() ch <- Response{data: data, status: status} }() select { case response := <-ch: return response.data, response.status case <-ctx.Done(): return "Request timed out", false } }</code>
タイムアウトが発生した場合、cancel() を呼び出すと、ctx 内で作成されたすべての HTTP リクエストがキャンセルされます。これにより、それらのリクエストによるさらなる処理やリソースの消費が防止されます。
以上がGoroutine でタイムアウト後に HTTP リクエストが続行されないようにする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。