Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mengutamakan Bacaan Saluran dalam Penyata `pilih` Go?

Bagaimanakah Saya Boleh Mengutamakan Bacaan Saluran dalam Penyata `pilih` Go?

Mary-Kate Olsen
Lepaskan: 2024-12-09 10:21:06
asal
802 orang telah melayarinya

How Can I Prioritize Channel Reads in Go's `select` Statement?

Pergi pilih Penyelesaian Keutamaan Penyata

Pertimbangkan senario berikut: anda mahu rutin Go memantau dua saluran, kekal disekat apabila kedua-dua saluran berada kosong. Walau bagaimanapun, apabila kedua-dua saluran mengandungi data, anda mengutamakan penyaliran satu saluran sebelum menangani saluran yang lain.

Masalah Asal:

Dalam sampel kod yang disediakan, anda mempunyai saluran keluar dan saluran keluar. Anda mahu nilai habis-habis diproses sebelum mengendalikan isyarat keluar. Walau bagaimanapun, penyataan pilih tidak mempunyai mekanisme keutamaan terbina dalam.

Penyelesaian Penyelesaian:

Go secara asli menyokong keutamaan ini, menghapuskan keperluan untuk penyelesaian. Penyelesaiannya melibatkan menjadikan saluran berhenti hanya boleh diakses oleh pengeluar. Apabila pengeluar selesai, ia menutup saluran berhenti. Pengguna terus membaca dari saluran keluar sehingga ia kosong dan saluran keluar ditutup.

Begini rupa kod yang diubah suai:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

var (
    produced  = 0
    processed = 0
)

func produceEndlessly(out chan int, quit chan bool) {
    defer close(out)
    for {
        select {
        case <-quit:
            fmt.Println("RECV QUIT")
            return
        default:
            out <- rand.Int()
            time.Sleep(time.Duration(rand.Int63n(5e6)))
            produced++
        }
    }
}

func main() {
    vals, quit := make(chan int, 10), make(chan bool)
    go produceEndlessly(vals, 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

Penjelasan:

Dalam kod yang diubah suai, hanya goroutine pengeluar mempunyai akses kepada saluran berhenti. Apabila pengeluar selesai, ia menutup saluran berhenti. Goroutine pengguna meneruskan bacaan dari saluran keluar sehingga ia kosong dan saluran berhenti ditutup. Ini memastikan bahawa semua nilai diproses sebelum pengguna keluar.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengutamakan Bacaan Saluran dalam Penyata `pilih` Go?. 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