同步示例: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()
}
- 1 回答
- 0 關注
- 133 瀏覽
添加回答
舉報
0/150
提交
取消