同步例:Golang非阻塞緩衝
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.
go例程的概念目前讓我困惑,所以任何指向正確方向的指針都會非常感謝,以幫助我學習。
更新:謝謝@JimB的幫助。爲什麼工人5總是會選擇工作?
jobCh := make(chan *job)
// Max 5 Workers
for 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"}
它不是第5個工人,每個工人都有i = 5。它應該是'去func(我int){...}(i)'https://golang.org/doc/faq#closures_and_goroutines – Darigaaz