首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作线程池

工作线程池
EN

Stack Overflow用户
提问于 2017-08-12 22:30:25
回答 1查看 1.3K关注 0票数 1

http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/提供的示例中,该示例已在许多地方被引用。

代码语言:javascript
复制
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如何获得可用工作渠道的补充?

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-12 22:43:33

如果你仔细阅读worker的代码,你会注意到

代码语言:javascript
复制
w.WorkerPool <- w.JobChannel

每次循环开始时,worker本身的通道就被放回原处

我将整个函数复制到下面:

代码语言:javascript
复制
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
            }
        }
    }()
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45651387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档