首頁  >  文章  >  後端開發  >  如何防止 Goroutine 中 HTTP 請求逾時後繼續?

如何防止 Goroutine 中 HTTP 請求逾時後繼續?

DDD
DDD原創
2024-11-01 05:43:02558瀏覽

How to Prevent HTTP Requests from Continuing After Timeout in a Goroutine?

Goroutine Timeout

提供的函數 Find() 使用 Goroutine 發出一系列 HTTP 請求並處理它們的回應。然而,令人擔憂的是,即使超過指定的逾時時間,這些請求也會在後台繼續運作。

潛在的 Goroutine 洩漏

不太可能存在 Goroutine 洩漏代碼。當 Find() 函數傳回逾時時,主 Goroutine 繼續運行,後台 Goroutine 實質上被放棄。

HTTP 請求取消

避免逾時後發出請求,解決方案是為每個 HTTP 請求使用 context.Context。上下文允許您在發生逾時時取消請求。

<code class="go">func Find() (interface{}, bool) {
  ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
  defer cancel()

  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 <-ctx.Done():
    return "Request timed out", false
  }
}</code>

發生逾時時,呼叫 cancel() 將取消 ctx 內建立的所有 HTTP 要求。這可以防止這些請求進行任何進一步的處理或消耗資源。

以上是如何防止 Goroutine 中 HTTP 請求逾時後繼續?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn