ホームページ  >  記事  >  バックエンド開発  >  goroutine リークを防ぎ、タイムアウトが発生したときに HTTP リクエストをキャンセルするにはどうすればよいですか?

goroutine リークを防ぎ、タイムアウトが発生したときに HTTP リクエストをキャンセルするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 08:22:02540ブラウズ

How to prevent goroutine leaks and cancel HTTP requests when a timeout occurs?

Goroutine のタイムアウトとキャンセル

提供されたコードは、HTTP 呼び出しを介して外部サービスからデータを取得しようとし、指定された期間後にタイムアウトする Find() 関数を定義します。 。ただし、提起される懸念は、Goroutine リークの可能性があるかどうか、およびタイムアウトが発生したときに HTTP リクエストをキャンセルする方法があるかどうかです。

コンテキストベースのキャンセル

キャンセルを効果的に制御するにはHTTP リクエストの場合、context.Context メカニズムを利用できます。タイムアウトのあるコンテキストを利用すると、タイムアウトに達したときにそのコンテキストに関連付けられたすべての HTTP リクエストが確実に終了します。

次のコードは、コンテキストベースのキャンセルを実装する方法を示しています。

<code class="go">// create a timeout or cancelation context to suit your requirements
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()

req, err := http.NewRequest("GET", location, nil)

// add the context to each request and they will be canceled in unison
resp, err := http.Do(req.WithContext(ctx))</code>

このコード内で、ctx はタイムアウトまたはキャンセル基準を指定し、defer cancel() は関数が戻るときにコンテキストが常にキャンセルされることを保証します。 req.WithContext(ctx) を介して各リクエストにコンテキストを追加すると、タイムアウトが切れるとすべてのリクエストが同時にキャンセルされます。

このアプローチにより、HTTP リクエストの作成を担当するゴルーチンがタイムアウトになったときに確実に終了されます。これにより、ゴルーチンのリークが防止され、システムがタイムアウトに即座に対応できるようになります。

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

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