亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

相當于Java中的golang通道

相當于Java中的golang通道

Go
DIEA 2021-07-26 20:12:26
我需要從一組阻塞隊列中讀取數據。阻塞隊列是由我使用的庫創建的。我的代碼必須從隊列中讀取。我不想為這些阻塞隊列中的每一個創建一個讀取器線程。相反,我想使用單個線程(或者可能最多使用 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 回答

  • 3 回答
  • 0 關注
  • 220 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號