我需要從一組阻塞隊列中讀取數據。阻塞隊列是由我使用的庫創建的。我的代碼必須從隊列中讀取。我不想為這些阻塞隊列中的每一個創建一個讀取器線程。相反,我想使用單個線程(或者可能最多使用 2/3 個線程)輪詢它們以了解數據的可用性。由于一些阻塞隊列可能長時間沒有數據,而其中一些可能會收到突發數據。輪詢具有較小超時值的隊列是可行的,但這根本沒有效率,因為即使其中一些隊列長時間沒有數據,它仍然需要繼續循環遍歷所有隊列?;旧?,我正在尋找一種關于阻塞隊列的 select/epoll(用于套接字)機制。任何線索真的很感激。不過,在 Go 中做到這一點真的很容易。下面的代碼使用通道和 goroutines 模擬相同的內容:package mainimport "fmt"import "time"import "math/rand"func sendMessage(sc chan string) { var i int for { i = rand.Intn(10) for ; i >= 0 ; i-- { sc <- fmt.Sprintf("Order number %d",rand.Intn(100)) } i = 1000 + rand.Intn(32000); time.Sleep(time.Duration(i) * time.Millisecond) }}func sendNum(c chan int) { var i int for { i = rand.Intn(16); for ; i >= 0; i-- { time.Sleep(20 * time.Millisecond) c <- rand.Intn(65534) } i = 1000 + rand.Intn(24000); time.Sleep(time.Duration(i) * time.Millisecond) }}func main() { msgchan := make(chan string, 32) numchan := make(chan int, 32) i := 0 for ; i < 8 ; i++ { go sendNum(numchan) go sendMessage(msgchan) } for { select { case msg := <- msgchan: fmt.Printf("Worked on %s\n", msg) case x := <- numchan: fmt.Printf("I got %d \n", x) } }}
- 3 回答
- 0 關注
- 220 瀏覽
添加回答
舉報
0/150
提交
取消