Go select 語句優先權解決方法
考慮以下場景:您希望Go 程式監視兩個通道,當兩個通道都處於阻塞狀態時,保持阻塞狀態空的。但是,當兩個通道都包含資料時,您需要先排空一個通道,然後再處理另一個通道。
原始問題:
在提供的程式碼範例中,您有一個輸出通道和一個出口通道。您希望在處理退出訊號之前處理所有輸出值。但是,select 語句沒有內建的優先權機制。
解決方案:
Go 原生支援這種優先級,無需解決方案。解決方案包括使退出通道僅可供生產者存取。當生產者完成時,它關閉退出通道。消費者繼續從 out 通道讀取數據,直到它為空並且退出通道關閉。
修改後的程式碼如下所示:
package main import ( "fmt" "math/rand" "time" ) var ( produced = 0 processed = 0 ) func produceEndlessly(out chan int, quit chan bool) { defer close(out) for { select { case <-quit: fmt.Println("RECV QUIT") return default: out <- rand.Int() time.Sleep(time.Duration(rand.Int63n(5e6))) produced++ } } } func main() { vals, quit := make(chan int, 10), make(chan bool) go produceEndlessly(vals, quit) for x := range vals { fmt.Println(x) processed++ time.Sleep(time.Duration(rand.Int63n(5e8))) } fmt.Println("Produced:", produced) fmt.Println("Processed:", processed) }
說明:
修改後的程式碼中,只有生產者goroutine 可以存取退出通道。當生產者完成時,它關閉退出通道。消費者 goroutine 繼續從 out 通道讀取數據,直到它為空並且退出通道關閉。這可確保在消費者退出之前處理所有輸出值。
以上是如何在 Go 的 select 語句中優先考慮通道讀取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!