提供されたコードは、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 サイトの他の関連記事を参照してください。