editor php Youzi akan menjawab soalan biasa dalam artikel ini: "Mengapa penampan Saluran Go tidak mengehadkan penulisan/pembacaan dengan betul?" Apabila kami menggunakan Saluran dengan penimbal, kami menjangkakan dapat mengawal kelakuan program dengan mengehadkan bilangan operasi tulis atau baca. Walau bagaimanapun, sebenarnya, penimbal Saluran tidak boleh secara langsung mengehadkan bilangan operasi tulis/baca. Punca dan penyelesaian kepada masalah ini akan dihuraikan di bawah.
Saya cuba berkomunikasi antara dua rutin pergi menggunakan saluran. Mula-mula, saya mencipta saluran integer dan kemudian menyerahkannya sebagai parameter kepada rutin pergi yang mencetak urutan nombor dari 0 hingga 10. Output program ini tidak masuk akal.
Ini adalah kod utama:
func worker(identifier string, ch chan<- int) { fmt.printf("entering worker %s\n", identifier) for i := 0; i < 10; i++ { fmt.printf("writing %d\n", i) ch <- i } fmt.printf("exiting worker %s\n", identifier) close(ch) } func main() { ch := make(chan int) go worker("1", ch) for v := range ch { fmt.printf("reading %d\n", v) } }
Untuk pelaksanaan kod ini, saya mendapat output berikut:
entering worker 1 writing 0 writing 1 reading 0 reading 1 writing 2 writing 3 reading 2 reading 3 writing 4 writing 5 reading 4 reading 5 writing 6 writing 7 reading 6 reading 7 writing 8 writing 9 reading 8 reading 9 exiting worker 1
Perhatikan bahawa terdapat dua pelaksanaan tulis diikuti oleh dua pelaksanaan baca.
Nanti saya tetapkan saiz buffer untuk mencapai fungsi berikut:
func main() { ch := make(chan int, 3) // <= buffer go worker("1", ch) for v := range ch { fmt.printf("reading %d\n", v) } }
Kemudian, kita mendapat output berikut:
Entering worker 1 Writing 0 Writing 1 Writing 2 Writing 3 Writing 4 Reading 0 Reading 1 Reading 2 Reading 3 Reading 4 Writing 5 Writing 6 Writing 7 Writing 8 Writing 9 Reading 5 Reading 6 Reading 7 Reading 8 Reading 9 Exiting worker 1
Perhatikan bahawa kini kami mempunyai 5 pelaksanaan tulis dan kemudian 5 pelaksanaan baca.
Setelah kami mempunyai kod dan output, persoalan terakhir timbul: mengapa pelaksanaan hukuman ini berkelakuan seperti yang mereka lakukan? Pertama, bukankah ia sepatutnya hanya membaca dan menulis satu nombor pada satu masa? Di luar itu, mengapa pelaksanaan kedua membaca dan menulis 5 nombor setiap kali dan bukannya 3 (kerana itu saiz penimbal)?
Anda semakin keliru apabila mencetak mesej dan apabila membaca atau menulis nombor daripada saluran.
Apabila penulisan berlaku, tiada mesej "tulis" berlaku. Ia berlaku pada satu ketika antara penulisan. Begitu juga, mesej "membaca" berlaku pada satu ketika antara bacaan.
Berikut ialah satu cara untuk mengatur coretan kod pertama, yang menghasilkan output yang ditunjukkan:
Kawalan sentiasa dihantar antara utama dan Pekerja seperti ini, masing-masing mencetak 2 mesej sebelum menyekat.
Begitu juga, klip kedua anda boleh disusun seperti ini:
Atas ialah kandungan terperinci Mengapakah had penimbal Go Channel tidak menulis/membaca dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!