在Golang 中取消長輪詢
使用http.Client 實作客戶端長輪詢時,通常需要這樣做能夠提前取消請求。這可以透過從單獨的 Goroutine 手動呼叫 resp.Body.Close() 來實現,但這不是一個標準且優雅的解決方案。
使用請求上下文取消
在 Golang 中取消 HTTP 請求的更慣用的方法是使用請求上下文。透過傳遞帶有截止日期或取消函數的上下文,可以從客戶端取消請求。以下程式碼示範如何使用請求上下文取消長輪詢請求:
import ( "context" "net/http" ) func main() { // Create a new HTTP client with a custom transport. client := &http.Client{ Transport: &http.Transport{ // Set a timeout for the request. Dial: (&net.Dialer{Timeout: 5 * time.Second}).Dial, TLSHandshakeTimeout: 5 * time.Second, }, } // Create a new request with a context that can be cancelled. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) req, err := http.NewRequest("POST", "http://example.com", nil) if err != nil { panic(err) } req = req.WithContext(ctx) // Start the request in a goroutine and cancel it after 5 seconds. go func() { _, err := client.Do(req) if err != nil { // Handle the canceled error. } }() time.Sleep(5 * time.Second) cancel() }
當呼叫cancel()函數時,請求將被取消,並在傳輸中指定Dial和TLSHandshakeTimeout將會受到尊重。
以上是如何在 Go 中取消長輪詢 HTTP 請求?的詳細內容。更多資訊請關注PHP中文網其他相關文章!