具有通道就緒性的非同步通訊
在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中文網其他相關文章!