ホームページ >バックエンド開発 >Golang >Goroutine リークを防止し、タイムアウト以内に HTTP リクエストをキャンセルするにはどうすればよいですか?

Goroutine リークを防止し、タイムアウト以内に HTTP リクエストをキャンセルするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-30 09:43:02729ブラウズ

How to Prevent Goroutine Leaks and Cancel HTTP Requests within a Timeout?

同時実行制御によるゴルーチン タイムアウト

提供されたコードでは、ゴルーチン (go func() ステートメント) を利用する関数 Find() を実装しました。 findCicCode() を使用した非同期データの取得。 goroutine からの応答を受信するために 50 ミリ秒のタイムアウトを設定しました。

ただし、タイムアウトを超えると goroutine リークの可能性が懸念されます。さらに、タイムアウトが発生したときに findCicCode() によって行われた HTTP リクエストをキャンセルできるようにしたいと考えています。

Goroutine Leak Prevention

Goroutine リークを処理するには、特定のスコープで作成されたゴルーチンがそのスコープが終了する前に確実に終了されるようにするためには、これが不可欠です。この場合、タイムアウトに達したときに select ステートメント内のゴルーチンをキャンセルすることが重要です。

<code class="go">case <-time.After(50 * time.Millisecond):
  // Cancel the goroutine to prevent a potential leak
  close(ch)
  return "Request timed out", false</code>

HTTP リクエストのキャンセル

次の手順で HTTP リクエストをキャンセルします。 goroutine では、Go 標準ライブラリが提供する context.Context と context.CancelFunc を利用できます:

<code class="go">// Create a context with a timeout of 50 milliseconds
ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
defer cancel()

// Execute the findCicCode() function within this context
data, status := findCicCodeWithContext(ctx)

// If the context is canceled (timeout), the HTTP requests will be aborted</code>

以上がGoroutine リークを防止し、タイムアウト以内に HTTP リクエストをキャンセルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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