Komunikasi Tak Segerak dengan Kesediaan Saluran
Dalam Go, saluran memudahkan komunikasi serentak antara goroutine. Apabila berurusan dengan saluran hantar buffer dan saluran terima tidak buffer, adalah mungkin untuk memilih pada kedua-dua saluran secara serentak untuk mengoptimumkan aliran komunikasi. Artikel ini meneroka pendekatan untuk melaksanakan fungsi ini sambil meminimumkan penggunaan CPU.
Untuk memahami isu ini, pertimbangkan konteks berikut:
<code class="go">s := make(chan<- int, 5) // Buffered send channel r := make(<-chan int) // Unbuffered receive channel</code>
Timbul persoalan sama ada boleh memilih pada kedua-duanya saluran supaya r dipilih apabila data tersedia untuk dibaca dan s dipilih apabila saluran tidak penuh.
Penyelesaian
Seseorang boleh mencapainya menggunakan pilihan pernyataan dengan kes lalai. Oleh kerana nilai yang akan dihantar dinilai hanya sekali apabila menggunakan pilih, jika kedua-dua saluran tidak bersedia, nilai tersebut menjadi lapuk. Untuk mengelakkan ini, kes lalai ditambahkan pada pernyataan pemilihan, yang akan dilaksanakan jika kedua-dua saluran tidak tersedia. Dalam kes lalai ini, program tidur untuk tempoh yang singkat, membolehkan saluran menjadi sedia, dan kemudian cuba lagi dengan nilai yang dikemas kini.
<code class="go">s := make(chan<- int, 5) r := make(<-chan int) for { v := valueToSend() // Evaluated each time we try to send select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // If none are ready currently, we end up here time.Sleep(time.Millisecond * 1) } }</code>
Amaran
Menggunakan len(r) atau cap(s) untuk menyemak kesediaan saluran dan kemudian menghantar/menerima adalah tidak disyorkan kerana saluran mungkin menukar keadaannya antara cek dan percubaan untuk menghantar/menerima.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Komunikasi Asynchronous dengan Kesediaan Saluran dalam Go Sambil Meminimumkan Penggunaan CPU?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!