首頁 > 後端開發 > Golang > 如何在 Go 中同時選擇緩衝發送和無緩衝接收通道?

如何在 Go 中同時選擇緩衝發送和無緩衝接收通道?

Mary-Kate Olsen
發布: 2024-10-29 07:20:30
原創
214 人瀏覽過

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

同時選擇發送和接收通道

在 Go 中,可以使用 select 語句在通道上執行非阻塞 I/O 操作。然而,在處理緩衝發送通道(chan

檢查通道長度/容量的問題

一種常見的方法是在發送或接收之前檢查通道的長度或容量。但是,這是不可靠的,因為通道的狀態可能會在檢查和後續操作之間發生變化:

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

    r <- v  // May block if another goroutine received from r in the meantime
}</code>
登入後複製

解決方案:帶有時間延遲的預設情況

要要解決此問題,您可以使用包含短時間延遲的預設情況的select 語句。這可以防止過度的CPU 使用,同時允許您在兩個通道都沒有準備好時重試操作:

<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>
登入後複製

透過添加預設情況,如果兩個通道都沒有準備好,程式只會阻塞一小段時間,允許在等待通道可用時釋放CPU 資源。

以上是如何在 Go 中同時選擇緩衝發送和無緩衝接收通道?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板