Jadual Kandungan
goroutine
saluran
Permintaan tak segerak
Rumah pembangunan bahagian belakang Golang permintaan asynchronous golang

permintaan asynchronous golang

May 18, 2023 pm 09:55 PM

Dengan perkembangan pesat Internet, semakin banyak aplikasi perlu berinteraksi dengan perkhidmatan luaran, dan API yang disediakan oleh perkhidmatan ini selalunya tidak segerak. Dalam program satu benang, permintaan penyegerakan sering menyebabkan kesesakan program, menjejaskan prestasi program dan kelajuan tindak balas. Oleh itu, dari segi permintaan tak segerak, reka bentuk unik bahasa golang membolehkan kami melaksanakan panggilan tak segerak dengan lebih mudah dan meningkatkan daya pemprosesan dan kelajuan tindak balas aplikasi.

Artikel ini akan memperkenalkan cara golang melaksanakan permintaan tak segerak, memahami goroutine dan saluran dalam golang serta cara menggunakannya untuk melaksanakan operasi tak segerak.

goroutine

goroutine dalam golang ialah benang ringan yang boleh melaksanakan berbilang tugas serentak dalam satu utas. Dengan menggunakan kata kunci go, kita boleh memulakan goroutine baharu dalam program ini. Ambil contoh mudah:

go func() {
    fmt.Println("Hello, goroutine!")
}()
Salin selepas log masuk

Dalam contoh di atas, kami memulakan goroutine baharu dan mencetak mesej dalam goroutine. Apabila kita menjalankan program, kita dapat melihat bahawa mesej dicetak sebelum mesej utas utama. Ini menunjukkan bahawa ia dilaksanakan dalam goroutine yang berbeza.

perlaksanaan goroutine akan bermula apabila pernyataan go dipanggil, bukan apabila fungsi bermula. Oleh itu, kita boleh memulakan berbilang goroutine dalam urutan yang sama dan melaksanakan berbilang tugas serentak tanpa perlu risau tentang keadaan perlumbaan di antara mereka.

saluran

saluran adalah satu lagi konsep penting dalam golang Ia adalah mekanisme komunikasi yang digunakan untuk penghantaran data antara gorouti yang berbeza. Kaedah mencipta saluran adalah sangat mudah:

ch := make(chan <type>)
Salin selepas log masuk

di mana, <type> ialah jenis data yang dihantar dalam saluran. Apabila menggunakan saluran, kita boleh menggunakan kata kunci <- untuk menghantar atau menerima mesej. Contohnya:

ch <- "Hello, channel!"
msg := <- ch
Salin selepas log masuk

Dalam contoh di atas, kami mula-mula menghantar mesej ke saluran dan kemudian menerima mesej daripada saluran. Begitu juga, kita juga boleh menghantar mesej dalam satu goroutine dan kemudian menerima mesej dalam goroutine lain untuk mencapai komunikasi antara goroutine yang berbeza.

Permintaan tak segerak

Dengan pengetahuan goroutine dan saluran yang diperkenalkan sebelum ini, kami kini boleh melaksanakan permintaan tak segerak dengan mudah. Sebagai contoh, kita boleh menulis fungsi yang menggunakan goroutine untuk memulakan operasi tak segerak dan menghantar hasilnya ke saluran apabila operasi selesai. Contohnya:

func asyncRequest(url string, ch chan<- []byte) {
    resp, err := http.Get(url)
    if err == nil {
        body, _ := ioutil.ReadAll(resp.Body)
        ch <- body
    }
}
Salin selepas log masuk

Dalam fungsi di atas, kami mula-mula menggunakan fungsi http.Get() untuk mendapatkan respons URL yang ditentukan. Kemudian, jika tiada ralat berlaku, kami menghantar badan respons ke saluran. Ambil perhatian bahawa kami menggunakan ch chan<- []byte dalam tandatangan fungsi, yang bermaksud bahawa saluran hanya boleh digunakan untuk menghantar data, bukan menerima data.

Kini kita boleh menggunakan fungsi ini untuk memulakan permintaan tak segerak dan menerima respons setelah permintaan selesai. Contohnya:

func main() {
    ch := make(chan []byte)
    go asyncRequest("https://www.example.com", ch)
    data := <- ch
    fmt.Printf("Response: %s
", data)
}
Salin selepas log masuk

Dalam contoh di atas, kami memulakan permintaan tak segerak dan menerima respons daripada saluran menggunakan sintaks <- ch. Apabila operasi tak segerak selesai, kami menerima respons dan mencetak kandungannya.

Menggunakan kaedah di atas, kami boleh melaksanakan permintaan tak segerak dengan mudah tanpa perlu risau tentang keadaan perlumbaan atau program yang tersekat. Selain itu, goroutine dan saluran dalam golang dengan mudah boleh memanjangkan aplikasi kami untuk melaksanakan operasi tak segerak yang lebih kompleks.

Atas ialah kandungan terperinci permintaan asynchronous golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Bagaimana anda menulis ujian unit di GO?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

See all articles