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
PHPzke hadapan
2024-02-09 10:09:21357semak imbas

缓冲通道的行为与我对 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")
}

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

Tetapi saya mendapat output,

main() started
1
4
9
16
main() stopped
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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Golang chromedp dockerfileArtikel seterusnya:Golang chromedp dockerfile