ゴルーチンを使用する場合、タイムアウトとゴルーチンの管理を考慮することが不可欠です。次のコード スニペットは、複数の HTTP 呼び出しの複合タイムアウトを組み込んだ関数を示しています。
<code class="go">func Find() (interface{}, bool) { 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 <-time.After(50 * time.Millisecond): return "Request timed out", false } }</code>
このアプローチはタイムアウトを処理する手段を提供しますが、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>
コンテキストを組み込むことで、HTTP リクエストを均一にキャンセルでき、バックグラウンドで実行されたままにならないようにできます。この手法は、Goroutine リークを回避し、コードの整合性を維持するのに役立ちます。
以上がGo で Goroutine リークを防止し、タイムアウトを効果的に管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。