当前位置: 首页 > 面试题库 >

工作线程池

慕容雅珺
2023-03-14
问题内容

在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
chan工作)会不会耗尽?因为<-d.WorkerPool从信道和信道工作拉出第一类型后没有被补充dispatcher.Run()被调用的第一次?还是我想念/误读了什么?如何为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)

问题答案:

如果您仔细阅读了工人的守则,您会发现

w.WorkerPool <- w.JobChannel

每次循环开始时,工作人员本身的渠道都会被退回

我在下面复制整个功能:

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
            }
        }
    }()
}


 类似资料:
  • 主线程通常被用于运行主循环,而主循环负责的都是 UI 相关的工作,所以也可以说主线程是 UI 线程。为了不影响 UI 线程的工作效率,我们会需要创建额外的线程来负责各种各样的工作,而这些线程就是工作线程。 在主循环的章节中,我们已经了解到主循环执行频率影响界面的流畅度,它的每一次循环都会按顺序执行处理定时器、处理事件队列、更新组件、渲染组件等任务,其中最容易影响到主循环的执行频率的任务是处理事件队

  • 我有4-5个工作线程处理大型消息队列。我还有另一段代码,它使用2-3个worker运行。我想在处理大型消息队列时阻止所有其他工作者。 我正在使用JDK6和Jms 编辑: 队列进程工作者从未终止。当没有消息时,它们阻塞队列。这些工作者由执行器线程池管理,如果我使用读写锁,其中一个工作者也会被阻塞。此外,如果使用循环屏障,那么我必须终止线程,以便重新传递阻塞的第二个进程。由于工作者是由线程池管理的,所

  • 基于文档https://netty . io/4.1/API/io/netty/channel/channel pipeline . html:< br > //告诉管道在与I/O线程不同的线程中运行MyBusinessLogicHandler的事件处理程序方法 //,这样I/O线程就不会被 //阻塞,这是一项耗时的任务。 //如果您的业务逻辑是完全异步的或很快就完成了,您不需要指定一个组。 pi

  • 问题内容: 我试图弄清楚如何移植要使用的线程程序。我有很多代码可以围绕几个标准库进行同步,基本上是这样的: 一个线程创建值(可能是用户输入),而另一个线程对它们执行某些操作。关键是这些线程在出现新数据之前一直处于空闲状态,此时它们将唤醒并对其进行处理。 我正在尝试使用asyncio实现此模式,但是我似乎无法弄清楚如何使其“运行”。 我的尝试或多或少看起来像这样(根本不做任何事情)。 我尝试过使用协

  • 我有一个应用程序调用插件DLL。其中一些调用是从辅助线程(即,不是UI线程)执行的,并且可能会弹出一个带有MessageBox的对话框。根据这个(http://www.codeproject.com/articles/121226/messagebox-and-worker-threads),有效的UI线程被切换到调用MessageBox的线程。这会使应用程序“崩溃”,因为消息泵停止接收消息。有什

  • 我试图理解fork-join的窃取部分。fork-join池具有具有自己Deque的工作线程。如果工作线程自身的deque为空,则该线程从另一个工作线程中窃取。 线程如何访问其他线程的状态? 当所有者线程和窃取者线程尝试访问取消排队中的同一项目时,它不会产生同步问题吗?