以下是我正在做的事情:一些工人为他们排队工作。
我有一个简单的工人:
func worker(jobs <-chan int, wg *sync.WaitGroup) {
for work := range jobs {
perform(work)
}
wg.Done()
}
启动它们:
jobs := make(chan int)
var wg sync.WaitGroup
for w := 1; w <= parallel; w++ {
wg.Add(1)
go worker(jobs, &wg)
}
我也有一个队列,这里有问题,如何检查是否有可用的工作人员,然后只写?
func queue(jobs chan int, stop chan bool) {
for {
select {
case jobs<-?: // How to check what worker is available?
work := receiveWork()
jobs <- work
continue
case <-stop:
return
}
}
}
}
启动队列:
stop := make(chan bool)
go queue(jobs, stop)
请注意,只有在有可用的工作人员时才应调用receiveWork()
。
答案 0 :(得分:1)
使用两个频道的一个选项,一个用于准备,一个用于实际工作:
func worker(ready chan struct{}, work chan int, wg *sync.WaitGroup) {
for range ready {
w, ok := <-work
if !ok {
break
}
perform(w)
}
wg.Done()
}
func queue(ready chan struct{}, work chan int, stop chan struct{}) {
defer close(ready)
defer close(work)
for {
select {
case ready <- struct{}{}:
work <- receiveWork()
case <-stop:
return
}
}
}