When working with goroutines, it's essential to consider timeout and goroutine management. The following code snippet demonstrates a function that incorporates a combined timeout for several HTTP calls:
<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>
While this approach provides a means to handle timeouts, there's a concern that HTTP calls may continue in the background even after the timeout has expired. To address this, consider using a context, which provides granular control over cancelation:
<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>
By incorporating a context, you can cancel HTTP requests uniformly, ensuring that they are not left running in the background. This technique helps avoid goroutine leaks and maintain code integrity.
The above is the detailed content of How to Prevent Goroutine Leaks and Manage Timeouts Effectively in Go?. For more information, please follow other related articles on the PHP Chinese website!