Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengutamakan Pengendalian Saluran dalam Penyata `pilih` Go?
Dalam Go, penyataan pilih membenarkan berbilang saluran dipantau secara serentak. Walau bagaimanapun, ia tidak semestinya mengutamakan satu saluran berbanding yang lain apabila kedua-duanya menerima data. Ini boleh menjadi masalah jika anda ingin memastikan bahawa mesej tertentu diproses dalam susunan tertentu.
Untuk menyelesaikan isu ini, kami boleh memanfaatkan mekanisme penutupan saluran terbina dalam Go dan lelaran julat ke atas saluran. Apabila saluran ditutup, ia memberi isyarat bahawa tiada lagi data akan dihantar. Dengan menutup saluran yang bertujuan untuk keluar hanya apabila semua mesej yang dikehendaki telah diproses, kami boleh mencipta sistem keutamaan dengan berkesan.
Pertimbangkan contoh berikut:
package main import ( "fmt" "math/rand" "sync" "time" ) var ( produced = 0 processed = 0 m sync.Mutex ) func produceEndlessly(out chan int, quit chan bool) { defer close(out) for { out <- rand.Int() time.Sleep(time.Duration(rand.Int63n(5e6))) m.Lock() produced++ m.Unlock() } } func quitRandomly(quit chan bool) { d := time.Duration(rand.Int63n(5e9)) time.Sleep(d) m.Lock() if produced > 10 { close(quit) } m.Unlock() } 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) m.Lock() processed++ m.Unlock() } fmt.Println("Produced:", produced) fmt.Println("Processed:", processed) }
Dalam contoh ini:
Dengan menutup berhenti apabila dihasilkan melebihi 10, kami memastikan bahawa kesemua 10 mesej diproses sebelum program ditamatkan. Lelaran julat ke atas blok vals sehingga saluran ditutup, menjamin bahawa semua mesej dikendalikan sebelum keluar dari gelung.
Pendekatan ini menyediakan cara yang mudah dan berkesan untuk mengutamakan pemprosesan mesej dalam pernyataan pilihan Go.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengutamakan Pengendalian Saluran dalam Penyata `pilih` Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!