Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Memilih pada Saluran Hantar Buffer dan Saluran Terima Tanpa Buffer Secara Serentak dalam Go?

Bagaimana untuk Memilih pada Saluran Hantar Buffer dan Saluran Terima Tanpa Buffer Secara Serentak dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-10-29 07:20:30
asal
215 orang telah melayarinya

How to Select on a Buffered Send and Unbuffered Receive Channel Simultaneously in Go?

Pilih pada Hantar Pergi dan Terima Saluran Serentak

Dalam Go, adalah mungkin untuk melakukan operasi I/O tanpa sekatan pada saluran menggunakan pernyataan pilih. Walau bagaimanapun, persoalan biasa timbul apabila berurusan dengan saluran penghantaran terbuffer (chan<-) dan saluran penerimaan yang tidak ditimbal (<-chan): bagaimana anda boleh memilih pada kedua-dua saluran secara serentak, mengutamakan saluran terima jika ia mempunyai data dan penghantaran saluran jika ia mempunyai kapasiti?

Isu dengan Menyemak Panjang/Kapasiti Saluran

Satu pendekatan biasa ialah menyemak panjang atau kapasiti saluran sebelum menghantar atau menerima. Walau bagaimanapun, ini tidak boleh dipercayai kerana keadaan saluran boleh berubah antara semakan dan operasi seterusnya:

<code class="go">if len(r) > 0 {
    // Optionally execute other code

    r <- v  // May block if another goroutine received from r in the meantime
}</p>
<h3>Penyelesaian: Kes Lalai dengan Kelewatan Masa</h3>
<p>Untuk menyelesaikan isu ini, anda boleh gunakan pernyataan pilih dengan kes lalai yang termasuk kelewatan masa yang singkat. Ini menghalang penggunaan CPU yang berlebihan sambil membenarkan anda mencuba semula operasi jika kedua-dua saluran tidak bersedia:</p>
<pre class="brush:php;toolbar:false"><code class="go">s := make(chan<- int, 5)
r := make(<-chan int)

for {
    v := valueToSend()
    select {
    case s <- v:
        fmt.Println("Sent value:", v)
    case vr := <-r:
        fmt.Println("Received:", vr)
    default: // If none are ready, delay execution
        time.Sleep(time.Millisecond * 1)
    }
}</code>
Salin selepas log masuk

Dengan menambahkan kes lalai, program hanya akan menyekat untuk tempoh yang singkat jika kedua-dua saluran tidak bersedia, membenarkan sumber CPU dikeluarkan sementara ia menunggu saluran tersedia.

Atas ialah kandungan terperinci Bagaimana untuk Memilih pada Saluran Hantar Buffer dan Saluran Terima Tanpa Buffer Secara Serentak dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan