Melaksanakan Keutamaan dalam Pernyataan Pilih Go
Pernyataan pilih Go membolehkan goroutines memultipleks pada berbilang saluran, memproses data daripada saluran yang menjadi sedia terlebih dahulu . Walau bagaimanapun, ia tidak menyokong saluran keutamaan. Artikel ini meneroka senario pengaturcaraan biasa di mana seseorang ingin mengutamakan saluran tertentu berbanding yang lain dalam pernyataan terpilih.
Dalam contoh yang diberikan, goroutine menghantar data ke dua saluran, keluar dan keluar. Walaupun kedua-dua saluran pada mulanya kosong, tujuannya adalah untuk memberi keutamaan supaya semua nilainya diproses sebelum mengendalikan keluar. Menggunakan pernyataan pilih standard, seperti yang dilihat dalam soalan, tidak mencapai tingkah laku yang diingini ini.
Untuk menangani isu ini, Go menyediakan penyelesaian yang elegan. Daripada bergantung pada keutamaan terbina dalam pilih, saluran yang harus diutamakan (dalam kes ini, keluar) harus boleh diakses hanya kepada goroutine penghantar. Apabila goroutine penghantar bersedia untuk ditamatkan, ia menutup saluran. Gorutin penerima, menggunakan gelung berasaskan julat untuk lelaran ke atas saluran (untuk x := val julat), akan terus memproses data sehingga saluran ditutup.
Melaksanakan penyelesaian ini menghasilkan kod berikut:
package main import ( "fmt" "math/rand" "time" ) var ( produced = 0 processed = 0 ) func produceEndlessly(vals chan int, quit chan bool) { defer close(vals) for { select { case vals <- rand.Int(): produced++ case <-quit: return } } } func quitRandomly(quit chan bool) { d := time.Duration(rand.Int63n(5e9)) fmt.Println("SLEEP", d) time.Sleep(d) fmt.Println("SEND QUIT") quit <- true } 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) }
Dalam kod yang dikemas kini ini, saluran keluar hanya disampaikan daripada goroutine penghantar. Ini memastikan bahawa berhenti tidak akan dipilih sehingga pengirim bersedia untuk ditamatkan. Akibatnya, goroutine penerima akan kehabisan semua data daripada vals sebelum mengendalikan keluar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengutamakan Saluran dalam Penyata Pilihan Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!