Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencapai Komunikasi Asynchronous dengan Kesediaan Saluran dalam Go Sambil Meminimumkan Penggunaan CPU?

Bagaimana untuk Mencapai Komunikasi Asynchronous dengan Kesediaan Saluran dalam Go Sambil Meminimumkan Penggunaan CPU?

Patricia Arquette
Patricia Arquetteasal
2024-10-27 05:34:03920semak imbas

How to Achieve Asynchronous Communication with Channel Readiness in Go While Minimizing CPU Utilization?

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!

Kenyataan:
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