Saya membuat pengambil URL di Go dan memiliki daftar URL untuk diambil. Saya mengirim http.Get()
permintaan ke setiap URL dan mendapatkan tanggapan mereka.
resp,fetch_err := http.Get(url)
Bagaimana cara mengatur waktu tunggu khusus untuk setiap permintaan Dapatkan? (Waktu default sangat lama dan itu membuat fetcher saya sangat lambat.) Saya ingin fetcher saya memiliki waktu tunggu sekitar 40-45 detik, setelah itu harus mengembalikan "waktu permintaan habis" dan beralih ke URL berikutnya.
Bagaimana saya bisa mencapai ini?
Jawaban:
Ternyata di Go 1.3 http.Client memiliki kolom Timeout
Itu trik untuk saya.
sumber
Get
mengembalikan kesalahan? Saya agak bingung karena Godoc forClient
mengatakan: Timer tetap berjalan setelah Get, Head, Post, atau Do kembali dan akan mengganggu pembacaan Response.Body. Jadi apakah itu berarti bahwa salah satuGet
atau pembacaanResponse.Body
dapat terganggu oleh kesalahan?http.Client.Timeout
vs.http.Transport.ResponseHeaderTimeout
?http.Client.Timeout
menyertakan waktu untuk membaca isi respons,http.Transport.ResponseHeaderTimeout
tidak memasukkannya.Anda perlu menyiapkan Klien Anda sendiri dengan Transport Anda sendiri yang menggunakan fungsi Dial kustom yang melingkupi DialTimeout .
Sesuatu seperti (sepenuhnya belum teruji ) ini :
sumber
Untuk menambah jawaban Volker, jika Anda juga ingin mengatur waktu tunggu baca / tulis selain waktu tunggu koneksi, Anda dapat melakukan hal seperti berikut ini
Kode ini telah diuji dan berfungsi dalam produksi. Inti lengkap dengan tes tersedia di sini https://gist.github.com/dmichael/5710968
Ketahuilah bahwa Anda perlu membuat klien baru untuk setiap permintaan karena dari
conn.SetDeadline
mana merujuk suatu titik di masa mendatangtime.Now()
sumber
Jika Anda ingin melakukannya sesuai permintaan, penanganan yang salah diabaikan agar singkatnya:
sumber
http.Client.Timeout
.Cara cepat dan kotor:
Ini mutasi keadaan global tanpa koordinasi apapun. Namun mungkin tidak masalah bagi pengambil url Anda. Jika tidak, buat instance pribadi dari
http.RoundTripper
:Tidak ada hal di atas yang diuji.
sumber
http.DefaultTransport.(*http.Transport).ResponseHeaderTimeout = time.Second * 45
banyak membantu saya dalam tes tulis untuk batas waktu permintaan. Terima kasih banyak.Anda dapat menggunakan https://github.com/franela/goreq yang menangani batas waktu dengan cara dan cara yang sederhana.
sumber
Ini mungkin membantu, tetapi perhatikan itu
ResponseHeaderTimeout
dimulai hanya setelah koneksi dibuat.sumber