首頁  >  文章  >  後端開發  >  如何在 Go 中實現通道就緒的非同步通信,同時最小化 CPU 使用率?

如何在 Go 中實現通道就緒的非同步通信,同時最小化 CPU 使用率?

Patricia Arquette
Patricia Arquette原創
2024-10-27 05:34:03920瀏覽

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

具有通道就緒性的非同步通訊

在Go中,通道促進了goroutine之間的並發通訊。當處理緩衝發送通道和無緩衝接收通道時,可以同時選擇兩個通道以優化通訊流。本文探討了在最小化 CPU 使用率的同時實現此功能的方法。

要理解該問題,請考慮以下上下文:

<code class="go">s := make(chan<- int, 5) // Buffered send channel
r := make(<-chan int)   // Unbuffered receive channel</code>

問題是是否可以同時選擇兩者通道,當資料可供讀取時,r 被選中,當通道未滿時,s 被選中。

可以使用 select 來實現這一點帶有預設情況的語句。由於使用 select 時僅評估一次要傳送的值,因此如果兩個頻道都未準備好,則該值將變得過時。為了避免這種情況,在選擇語句中加入了預設情況,如果兩個通道都沒有準備好,則執行該預設情況。在這種預設情況下,程式會短暫休眠,讓通道準備就緒,然後使用更新的值重試。

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

警告

不建議使用len(r) 或cap(s) 檢查通道準備情況,然後發送/接收,因為通道可能會在檢查和嘗試發送/接收之間改變其狀態。

以上是如何在 Go 中實現通道就緒的非同步通信,同時最小化 CPU 使用率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn