首页 >后端开发 >Golang >Go中发生超时时如何有效取消HTTP请求?

Go中发生超时时如何有效取消HTTP请求?

Patricia Arquette
Patricia Arquette原创
2024-10-29 18:11:04852浏览

How can I effectively cancel HTTP requests in Go when a timeout occurs?

了解 Goroutine 超时

在您提供的代码中,您已经使用 select 语句实现了超时机制来处理 findCicCode() 函数的结果或超时50 毫秒。但是,您表示担心如果 HTTP 调用即使在超时后继续执行,也可能会导致资源泄漏。

利用上下文进行 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>

在此修改后的代码中:

  • context.Context 与取消函数一起创建。
  • findCicCode() 函数会传递 ctx,以在发生超时时取消正在进行的请求。
  • 每个在 findCicCode() 函数中创建的 HTTP 请求使用 req.WithContext(ctx) 分配 ctx​​。
  • 如果发生超时,则会调用取消函数,从而取消与 ctx 关联的所有正在进行的 HTTP 请求.

通过使用此方法,您可以确保在达到超时时取消任何正在进行的 HTTP 请求,从而防止不必要的资源消耗。

以上是Go中发生超时时如何有效取消HTTP请求?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn