Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh membatalkan permintaan HTTP dengan berkesan dalam Go apabila tamat masa berlaku?

Bagaimanakah saya boleh membatalkan permintaan HTTP dengan berkesan dalam Go apabila tamat masa berlaku?

Patricia Arquette
Patricia Arquetteasal
2024-10-29 18:11:04914semak imbas

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

Memahami Goroutine Timeout

Dalam kod yang anda berikan, anda telah melaksanakan mekanisme tamat masa menggunakan pernyataan pilih untuk mengendalikan sama ada hasil daripada fungsi findCicCode() atau tamat masa daripada 50 milisaat. Walau bagaimanapun, anda menyatakan kebimbangan tentang potensi kebocoran sumber jika panggilan HTTP terus dilaksanakan walaupun selepas tamat masa.

Menggunakan Konteks untuk Pembatalan Permintaan HTTP

Untuk menangani isu ini, anda boleh memanfaatkan konsep konteks dalam Go. Konteks menyediakan cara untuk mengaitkan nilai khusus konteks dengan goroutin dan membenarkan pembatalan. Dengan konteks, anda boleh membatalkan panggilan HTTP yang sedang berjalan apabila tamat masa berlaku.

Berikut ialah contoh cara anda boleh melaksanakan pembatalan konteks untuk permintaan 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>

Dalam kod yang diubah suai ini:

  • Konteks.Konteks dicipta bersama-sama dengan fungsi batal.
  • Fungsi findCicCode() dihantar ctx untuk membatalkan permintaan yang sedang berjalan jika tamat masa berlaku.
  • Setiap Permintaan HTTP yang dibuat dalam fungsi findCicCode() diberikan ctx menggunakan req.WithContext(ctx).
  • Jika tamat masa berlaku, fungsi batal dipanggil, yang seterusnya membatalkan semua permintaan HTTP berterusan yang dikaitkan dengan ctx .

Dengan menggunakan pendekatan ini, anda memastikan bahawa sebarang permintaan HTTP yang berterusan dibatalkan apabila tamat masa dicapai, menghalang penggunaan sumber yang tidak perlu.

Atas ialah kandungan terperinci Bagaimanakah saya boleh membatalkan permintaan HTTP dengan berkesan dalam Go apabila tamat masa berlaku?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn