在您提供的代码中,您已经使用 select 语句实现了超时机制来处理 findCicCode() 函数的结果或超时50 毫秒。但是,您表示担心如果 HTTP 调用即使在超时后继续执行,也可能会导致资源泄漏。
要解决此问题,您可以利用Go 中上下文的概念。 Context 提供了一种将上下文特定值与 goroutine 关联起来的方法,并允许取消。通过上下文,您可以在发生超时时取消正在进行的 HTTP 调用。
以下是如何实现 HTTP 请求的上下文取消的示例:
<code class="go">package main import ( "context" "fmt" "net/http" "time" ) type Response struct { data interface{} status bool } func Find() (interface{}, bool) { ch := make(chan Response, 1) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() // Ensure cancelation when the function exits go func() { data, status := findCicCode(ctx) 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 } } func main() { data, timedOut := Find() fmt.Println(data, timedOut) }</code>
在此修改后的代码中:
通过使用此方法,您可以确保在达到超时时取消任何正在进行的 HTTP 请求,从而防止不必要的资源消耗。
以上是Go中发生超时时如何有效取消HTTP请求?的详细内容。更多信息请关注PHP中文网其他相关文章!