Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Penyata `select` Go Mengendalikan Keutamaan Saluran, dan Apakah Pendekatan Paling Cekap?

Bagaimanakah Penyata `select` Go Mengendalikan Keutamaan Saluran, dan Apakah Pendekatan Paling Cekap?

Patricia Arquette
Lepaskan: 2024-12-01 09:16:11
asal
264 orang telah melayarinya

How Does Go's `select` Statement Handle Channel Priority, and What's the Most Efficient Approach?

Keutamaan dalam Penyata Go Select: Pemahaman yang Disemak

Dalam Go, penyataan pilih ialah alat serba boleh untuk mengendalikan berbilang saluran secara serentak. Walau bagaimanapun, secara lalai, ia beroperasi tanpa sebarang pesanan keutamaan, yang berpotensi membawa kepada hasil yang tidak dijangka. Artikel ini mengkaji senario penyelesaian biasa dan memberikan pemahaman yang lebih bernuansa tentang pengendalian keutamaan dalam Go.

Pertimbangkan coretan kod berikut:

func sender(out chan int, exit chan bool) {
    for i := 1; i <= 10; i++ {
        out <- i
    } 
    exit <- true
}

func main(){
    out := make(chan int, 10)
    exit := make(chan bool)

    go sender(out, exit)

    L:
    for {
        select {
            case i := <-out:
                fmt.Printf("Value: %d\n", i)
            case <-exit:
                fmt.Println("Exiting")
                break L
        }
    }
    fmt.Println("Did we get all 10? Most likely not")
}
Salin selepas log masuk

Dalam contoh ini, kami ingin menerima nilai daripada kedua-dua saluran keluar dan keluar dan mengendalikannya dalam susunan tertentu. Walau bagaimanapun, penyataan pilih membenarkan kedua-dua saluran dikendalikan secara serentak, membolehkan anda menerima isyarat keluar sebelum semua nilai dari keluar diterima.

Untuk menangani isu ini, penyelesaian yang biasa dicadangkan ialah menggunakan kes lalai untuk saluran yang tidak dikendalikan. Walau bagaimanapun, kenyataan pilihan Go menyokong pengendalian keutamaan secara asli, menghapuskan keperluan untuk penyelesaian.

Penyelesaian Asli

Kuncinya terletak pada mengasingkan saluran keluar kepada pengeluar. Apabila pengeluar ingin memberi isyarat penamatan, ia menutup saluran keluar. Akibatnya, hanya apabila saluran keluar kosong dan ditutup, pengguna akan menerima isyarat keluar. Ini dicapai dengan mengedarkan saluran keluar:

func main() {
    vals, quit := make(chan int, 10), make(chan bool)
    go produceEndlessly(vals, quit)
    go quitRandomly(quit)
    for x := range vals {
        fmt.Println(x)
        processed++
        time.Sleep(time.Duration(rand.Int63n(5e8)))
    }
    fmt.Println("Produced:", produced)
    fmt.Println("Processed:", processed)
}
Salin selepas log masuk

Dalam contoh yang diubah suai ini, fungsi produceEndlessly secara berterusan menolak nilai ke dalam saluran vals sehingga ia menerima isyarat untuk berhenti. Fungsi quitRandomly menghantar isyarat selepas kelewatan rawak.

Dengan menjangkau saluran vals, pengguna menunggu sehingga semua nilai telah diterima dan saluran ditutup sebelum meneruskan untuk mengendalikan isyarat keluar. Ini memastikan bahawa semua nilai daripada saluran vals diproses sebelum program keluar.

Kesimpulan

Penyataan pilih Go menyediakan penyelesaian yang mantap untuk mengendalikan berbilang saluran secara serentak. Dengan memahami keupayaan pengendalian keutamaan asli Go, adalah mungkin untuk melaksanakan mekanisme pemilihan berasaskan keutamaan tanpa memerlukan penyelesaian. Pendekatan ini memudahkan kod dan meningkatkan kejelasan dan kecekapan pengendalian saluran dalam program Go.

Atas ialah kandungan terperinci Bagaimanakah Penyata `select` Go Mengendalikan Keutamaan Saluran, dan Apakah Pendekatan Paling Cekap?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan