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

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

Golang 非阻塞緩沖區

Golang 非阻塞緩沖區

Go
智慧大石 2022-01-17 17:41:51
同步示例:type job struct {    Id int    Message string}for {    // getJob() blocks until job is received    job := getJob()    doSomethingWithJob(job)}getJob我希望處理來自doSomethingWithJob. 例如,getJob 可以是從 MessagingQueue(如 RabbitMQ/Beanstalkd)或處理 HTTP 請求接收到的有效負載。我不想阻止getJob,doSomethingWithJob反之亦然。但是,我確實想控制/緩沖作業的數量,以免系統過載。例如最大并發數為 5。目前,goroutines 的概念讓我感到困惑,所以任何正確方向的指針都將不勝感激,以幫助我學習。更新:感謝@JimB 的幫助。為什么工人 5 總是接班?jobCh := make(chan *job)// Max 5 Workersfor i := 0; i < 5; i++ {    go func() {        for job := range jobCh {            time.Sleep(time.Second * time.Duration(rand.Intn(3)))            log.Println(i, string(job.Message))        }    }()}for {    job, err := getJob()    if err != nil {        log.Println("Closing Channel")        close(jobCh)        break    }    jobCh <- job}log.Println("Complete")示例輸出2016/06/09 22:19:57 5 {"id":10692,"name":"Test Message"}2016/06/09 22:19:57 5 {"id":10687,"name":"Test Message"}2016/06/09 22:19:57 5 {"id":10699,"name":"Test Message"}2016/06/09 22:19:57 5 {"id":10701,"name":"Test Message"}2016/06/09 22:19:57 5 {"id":10703,"name":"Test Message"}2016/06/09 22:19:57 5 {"id":10704,"name":"Test Message"}
查看完整描述

1 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

您可以啟動 5 個從通道讀取的 goroutine 來調用doSomethingWithJob. 這樣,同時處理的作業永遠不會超過 5 個。


jobCh := make(chan *job)


// start 5 workers to process jobs

for i := 0; i < 5; i++ {

    go func() {

        for job := range jobCh {

            doSomethingWithJob(job)

        }

    }()

}


// send jobs to workers as fast as we can

for {

    jobCh <- getJob()

}


查看完整回答
反對 回復 2022-01-17
  • 1 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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