在http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/提供的示例中,该示例已在许多地方被引用。
func (d *Dispatcher) dispatch() {
for {
select {
case job := <-JobQueue:
// a job request has been received
go func(job Job) {
// try to obtain a worker job channel that is available.
// this will block until a worker is idle
jobChannel := <-d.WorkerPool
// dispatch the job to the worker job channel
jobChannel <- job
}(job)
}
}
}在调度服务了MaxWorker数量的作业之后,工作池(chan作业)不会耗尽吗?因为在第一次调用第一个类型dispatcher.Run()之后,<-d.WorkerPool正在从通道中拉出,而作业通道没有被补充?或者我是不是漏掉了什么?WorkerPool如何获得可用工作渠道的补充?
go func(job Job) {
// try to obtain a worker job channel that is available.
// this will block until a worker is idle
jobChannel := <-d.WorkerPool
// dispatch the job to the worker job channel
jobChannel <- job
}(job)发布于 2017-08-12 22:43:33
如果你仔细阅读worker的代码,你会注意到
w.WorkerPool <- w.JobChannel每次循环开始时,worker本身的通道就被放回原处
我将整个函数复制到下面:
func (w Worker) Start() {
go func() {
for {
// register the current worker into the worker queue.
w.WorkerPool <- w.JobChannel
select {
case job := <-w.JobChannel:
// we have received a work request.
if err := job.Payload.UploadToS3(); err != nil {
log.Errorf("Error uploading to S3: %s", err.Error())
}
case <-w.quit:
// we have received a signal to stop
return
}
}
}()
}https://stackoverflow.com/questions/45651387
复制相似问题