Netty体系结构-关于NioWorker循环的问题

Netty体系结构-关于NioWorker循环的问题,netty,Netty,我正在研究niowerner.run()方法,并试图了解它是如何工作的。 以下是代码的简化版本: for(;;) { try { SelectorUtil.select(selector); if (wakenUp.get()) { selector.wakeup(); } cancelledKeys = 0; processRegisterTaskQ

我正在研究niowerner.run()方法,并试图了解它是如何工作的。 以下是代码的简化版本:

    for(;;) {           
      try {
        SelectorUtil.select(selector);

        if (wakenUp.get()) {
          selector.wakeup();
        }

        cancelledKeys = 0;
        processRegisterTaskQueue();
        processWriteTaskQueue();
        processSelectedKeys(selector.selectedKeys());

      } catch (Throwable t) {
      }
    }
更不清楚的是,它的作用是什么,但我有一些问题:

1.选择器。选择(选择器)以500毫秒超时执行选择。 为什么它不仅仅是一个阻塞呼叫

2.以下片段的目的是什么?为什么我们需要进行唤醒

    if (wakenUp.get()) {
       selector.wakeup();
    }
提前谢谢

  • 我们使用一个基于时间的阻塞选择器。select(..)调用,因为我们还通过processRegisterTaskQueue()方法处理向工作者注册新通道的过程。如果我们不使用基于时间的通话,我们就有可能放慢速度。在最近的版本中,我们甚至更改了Selector.select(..)调用以使用10ms

  • 见[1]中的评论


  • [1]

    1。据我所知,阻塞选择器将在新连接到达时解除阻塞,因此您不必进行基于时间的调用,即可调用processRegisterTaskQueue。2.附件中的注释仅讨论wakenUp.get()。我想知道为什么必须唤醒选择器?是否有多个线程使用选择器?在boss线程上,可以使用IO工作线程处理连接所使用的选择器的单独选择器来接受新连接。从boss选择器到IO工作者选择器的切换由boss线程处理,将任务放置在队列上,向IO工作者注册新通道,然后由IO工作者处理。必须唤醒IO工作者以处理队列。