tetapan tamat masa http golang

PHPz
Lepaskan: 2023-05-15 11:16:07
asal
1969 orang telah melayarinya

Bahasa Go ialah bahasa pengaturcaraan yang cekap yang menyokong pengaturcaraan serentak, jadi ia luar biasa dalam pengaturcaraan rangkaian. Protokol HTTP ialah bahagian penting dalam membina aplikasi Internet Pakej http dalam bahasa Go juga menyediakan sejumlah besar antara muka untuk menyokong permintaan dan respons HTTP. Apabila membuat panggilan rangkaian HTTP, konfigurasi tamat masa adalah sangat penting untuk memastikan kestabilan dan prestasi program.

Tetapan tamat masa ialah topik yang sangat penting, ia digunakan untuk menentukan berapa lama program perlu menunggu apabila membuat permintaan rangkaian atau menunggu respons. Dalam permintaan HTTP, jika pelayan tidak bertindak balas dalam masa, pelanggan perlu menamatkan permintaan dan melaksanakan logik lain. Begitu juga, dalam tindak balas sambungan yang panjang, jika pelanggan telah menunggu respons dan tidak dapat mengekalkan sambungan dalam masa tamat, keseluruhan program mungkin hang.

Oleh itu, dalam bahasa Go, penyelidikan tentang skim kawalan dan penyelesaian teknikal untuk tetapan tamat masa telah sangat aktif sejak beberapa tahun kebelakangan ini. Artikel ini akan memperkenalkan secara terperinci tetapan tamat masa dalam panggilan rangkaian HTTP menggunakan bahasa Go.

  1. Had tamat masa dalam Go

Dalam bahasa Go, had tamat masa boleh dilaksanakan melalui pakej masa. Pakej masa menyediakan jenis Pemasa yang boleh digunakan untuk melaksanakan pemprosesan tamat masa dan pemasaan. Gunakan Pemasa untuk mencipta tempoh masa yang akan tamat selepas tempoh masa tertentu. Kami boleh membuat tinjauan jika pemasa ini telah tamat tempoh. Jika pemasa telah tamat tempoh, lakukan beberapa tindakan, seperti membatalkan permintaan atau pilih pelayan alternatif. Pelaksanaan khusus adalah seperti berikut:

timer := time.NewTimer(timeout)
defer timer.Stop()
select {
    case <-ch:
        return
    case <-timer.C:
        cancel()
        return
}
Salin selepas log masuk

Kod di atas menggunakan saluran C pilih dan pemasa untuk menunggu. Jika saluran ch menghantar data kepada penerima, pilih akan melaksanakan operasi yang sepadan. Jika pemasa telah tamat tempoh, ia akan memanggil fungsi batal untuk membatalkan operasi yang sedang berjalan.

  1. Gunakan pakej konteks untuk kawalan tamat masa

Dalam bahasa Go, pakej konteks ialah alat tetapan tamat masa yang baik. Pakej konteks menyediakan cara untuk mengawal nilai, isyarat pembatalan dan tarikh akhir merentas panggilan ke berbilang goroutine. Kaedah context.WithTimeout mengawal tamat masa dengan menetapkan tamat masa untuk konteks dan mengembalikan konteks baharu. Jika operasi selesai dalam masa yang ditetapkan, pemasa tamat masa dimatikan. Jika operasi tidak selesai dalam masa yang ditetapkan, matikan pemasa tamat masa dan batalkan operasi yang sedang berjalan. Ini menjadikan context.WaitGroup sesuai untuk mengendalikan pelaksanaan berbilang goroutin. Pelaksanaan khusus adalah seperti berikut:

ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()

req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
    log.Fatal(err)
}

res, err := http.DefaultClient.Do(req)
if err != nil {
    log.Fatal(err)
}
defer res.Body.Close()

body, err := ioutil.ReadAll(res.Body)
if err != nil {
    log.Fatal(err)
}
Salin selepas log masuk

Dalam kod di atas, konteks terkawal tamat masa dibuat melalui kaedah context.WithTimeout. Kemudian, cipta permintaan http dan pautkan konteks dengan objek permintaan melalui kaedah http.NewRequestWithContext. Akhir sekali, gunakan kaedah http.DefaultClient.Do untuk membuat permintaan rangkaian dan membaca kandungan respons selepas permintaan itu selesai. Jika tamat masa berlaku, konteks akan dibatalkan, menyekat sebarang permintaan berikutnya.

  1. Amalan terbaik untuk menggunakan tetapan tamat masa

Apabila menggunakan tetapan tamat masa, anda perlu memberi perhatian kepada perkara berikut:

3.1 Tetapkan tamat masa yang munasabah tempoh:

Tamat masa hendaklah cukup lama untuk membenarkan masa yang diperlukan untuk memproses permintaan dan respons HTTP, tetapi tidak terlalu lama sehingga menghalang atur cara daripada digantung. Jika tamat masa ditetapkan terlalu lama, ia mungkin menghalang aplikasi daripada bertindak balas kepada operasi lain. Jika tamat masa ditetapkan terlalu singkat dan permintaan ditinggalkan terlalu cepat, ralat yang tidak perlu akan berlaku. Oleh itu, tamat masa hendaklah ditetapkan mengikut situasi sebenar.

3.2 Gunakan kaedah withContext untuk tetapan tamat masa

Apabila membuat permintaan rangkaian, kita harus menetapkan konteks kepada kaedah http.NewRequestWithContext, yang boleh memastikan hubungan rapat antara permintaan dan tetapan tamat masa. Jika anda hanya menetapkan tetapan Tamat Masa dalam http.Client.Transport, ia boleh menyebabkan ralat permintaan.

3.3 Kawal percubaan semula permintaan dengan betul:

Apabila membuat permintaan rangkaian, perhatian harus diberikan kepada mengawal bilangan percubaan semula permintaan dengan betul. Jika permintaan tamat, kita harus menetapkan berapa kali permintaan itu boleh dicuba semula untuk cuba menolak keputusan kepada pengguna dan bukannya menamatkannya secara terus.

  1. Ringkasan

Artikel ini terutamanya memperkenalkan penggunaan tetapan tamat masa dalam bahasa Go untuk memastikan kestabilan dan prestasi permintaan rangkaian HTTP. Kita boleh menggunakan pakej masa atau pakej konteks untuk menetapkan had tamat masa. Tetapan ini berkesan boleh menghalang program hang dan ralat yang tidak perlu semasa menjalankan operasi rangkaian. Pada masa yang sama, keadaan sebenar perlu dipertimbangkan apabila menetapkan tamat masa dan bilangan percubaan semula yang sesuai harus dikekalkan. Dalam penggunaan sebenar, ia harus digunakan mengikut situasi untuk memastikan kestabilan dan prestasi program.

Atas ialah kandungan terperinci tetapan tamat masa http golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan