Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah tingkah laku saluran penimbal berbeza daripada apa yang saya jangkakan daripada Go?

Bagaimanakah tingkah laku saluran penimbal berbeza daripada apa yang saya jangkakan daripada Go?

PHPz
Lepaskan: 2024-02-09 10:09:21
ke hadapan
403 orang telah melayarinya

缓冲通道的行为与我对 Go 的期望有何不同?

Dalam bahasa Go, saluran penimbal ialah jenis saluran khas yang berkelakuan berbeza daripada saluran biasa. Apabila saluran biasa menghantar data, penghantar akan disekat sehingga penerima menerima data. Saluran penimbal membolehkan pengirim meneruskan penghantaran data apabila saluran tidak penuh tanpa disekat. Ini membolehkan pengirim menyelesaikan operasi penghantaran dengan lebih cepat tanpa perlu menunggu penerima. Bagi pengguna bahasa Go, gelagat saluran penimbal boleh memberikan prestasi serentak yang lebih tinggi dan kelajuan tindak balas yang lebih baik.

Kandungan soalan

Saya cuba memahami cara saluran penimbal berfungsi dan menulis coretan kod untuknya

package main

import (
    "fmt"
)

func squares(c chan int) {
    for i := 0; i < 4; i++ {
        num := <-c
        fmt.println(num * num)
    }
}

func main() {
    fmt.println("main() started")
    c := make(chan int, 3)
    
        go squares(c)

    c <- 1
    c <- 2
    c <- 3
    c <- 4 // blocks here

    fmt.println("main() stopped")
}
Salin selepas log masuk

Cara saya menjangkakan program akan bertindak, goroutine utama bermula dan berterusan sehingga c<-4, di mana ia menyekat dan mengawal pergi ke goroutine segi empat sama (kerana kapasiti penimbal ialah 3). Gelung dalam petak goroutine berterusan sehingga lelaran keempat, apabila saluran kosong. Operasi baca pada saluran kosong akan disekat, jadi kawalan dikembalikan kepada goroutine utama. Pada masa ini, operasi tulis ke saluran (c<-4) dilaksanakan, kami mencetak "main() telah berhenti", dan program tamat.

bermakna output jangkaan saya ialah,

main() started
1
4
9
main() stopped
Salin selepas log masuk

Tetapi saya mendapat output,

main() started
1
4
9
16
main() stopped
Salin selepas log masuk
bagaimana? Adakah saya terlepas sesuatu tentang cara saluran berfungsi?

Penyelesaian

Bukan begitu cara saluran berfungsi.

Gorutin berjalan serentak. Ini bermakna apabila Goroutine menghantar ke saluran penimbal, Goroutine lain yang menunggu untuk menerima daripada saluran itu boleh menerimanya dengan segera. Ia tidak menunggu saluran penuh.

Bagi penghujung program, apabila anda menghantar nombor terakhir ke saluran, tiada jaminan bahawa goroutine akan mengambilnya dan mencetak output sebelum program tamat, kerana anda tidak menunggu goroutine selesai. Jadi, nasib baik, ia berjalan dan mencetak output. Akan ada pelaksanaan lain di mana ini tidak akan berlaku dan program akan ditamatkan sebelum goroutine mencetak output.

Atas ialah kandungan terperinci Bagaimanakah tingkah laku saluran penimbal berbeza daripada apa yang saya jangkakan daripada Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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