首頁 >後端開發 >Golang >Go中發生逾時時如何有效取消HTTP請求?

Go中發生逾時時如何有效取消HTTP請求?

Patricia Arquette
Patricia Arquette原創
2024-10-29 18:11:04862瀏覽

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