Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memilih dengan Cekap pada Saluran Hantar dan Terima Tidak Buffer dalam Go?

Bagaimana untuk Memilih dengan Cekap pada Saluran Hantar dan Terima Tidak Buffer dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-10-28 17:51:29606semak imbas

How to Efficiently Select on Buffered Send and Unbuffered Receive Channels in Go?

Bahasa Go: Memilih Pada Saluran Ditimpan dan Tidak Ditimpan secara serentak

Tugas di tangan adalah untuk mencapai pemilihan serentak pada saluran penghantaran terkumpul dan saluran terima tanpa penampan tanpa sentiasa menggunakan sumber CPU. Senario ini bersamaan dengan menyekat sehingga saluran sedia untuk dihantar tanpa menghantar sebarang data.

Untuk menangani perkara ini, kami boleh menggunakan penyata terpilih dengan kes lalai. Apabila kedua-dua saluran tidak tersedia, kes lalai akan dicetuskan, memulakan tempoh tidur yang singkat. Ini membolehkan pemuliharaan sumber sambil masih mendayakan percubaan berterusan untuk menghantar dan menerima data:

<code class="go">package main

import (
    "fmt"
    "time"
)

func valueToSend() int {
    // Generate a value to send, calculated/acquired each attempt
    return 0
}

func main() {
    s := make(chan<- int, 5)
    r := make(<-chan int)

    for {
        v := valueToSend() // Updated value for each send attempt
        select {
        case s <- v:
            fmt.Println("Sent value:", v)
        case vr := <-r:
            fmt.Println("Received:", vr)
        default: // None of the channels are ready
            time.Sleep(time.Millisecond * 1)
        }
    }
}</code>

Berhati-hati mesti dilakukan apabila bergantung pada panjang saluran atau semakan kapasiti sebelum menghantar atau menerima data. Pendekatan sedemikian boleh membawa kepada tingkah laku yang tidak dijangka, kerana keadaan saluran boleh berubah di antara semakan dan operasi hantar/terima sebenar.

Atas ialah kandungan terperinci Bagaimana untuk Memilih dengan Cekap pada Saluran Hantar dan Terima Tidak Buffer dalam Go?. 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