Pakej Go http: Tangkap Isyarat Pembatalan dalam Permintaan dengan Badan
Soalan: Mengapa pakej Go http gagal menangkap isyarat pembatalan untuk POST permintaan dengan badan?
Jawapan: Pelayan http Go membaca badan permintaan untuk mengesan apabila pelanggan menutup sambungan. Sehingga badan dibaca, tiada semakan untuk sambungan tertutup dibuat.
Oleh itu, untuk mengendalikan perkara ini dengan betul, baca badan permintaan secepat mungkin, walaupun ia tidak diperlukan dalam logik pengendalian permintaan.
Penyelesaian:
func handler(w http.ResponseWriter, r *http.Request) { go func(done <-chan struct{}) { <-done fmt.Println("message", "client connection has gone away, request got cancelled") }(r.Context().Done()) io.Copy(ioutil.Discard, r.Body) // Read the body to detect the closed connection time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
Apabila pelanggan menutup sambungan awal, kod ini akan mengesannya dan membatalkan sebarang sambungan yang sedang berjalan. kerja.
Atas ialah kandungan terperinci Mengapa Pakej `http` Go terlepas Isyarat Pembatalan dalam Permintaan POST dengan Badan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!