ホームページ >バックエンド開発 >Golang >Goroutine でタイムアウト後に HTTP リクエストが続行されないようにする方法は?

Goroutine でタイムアウト後に HTTP リクエストが続行されないようにする方法は?

DDD
DDDオリジナル
2024-11-01 05:43:02639ブラウズ

How to Prevent HTTP Requests from Continuing After Timeout in a Goroutine?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。