【问题标题】:Netty architecture - questions about NioWorker loopNetty 架构——关于 NioWorker 循环的问题
【发布时间】:2012-04-18 03:12:55
【问题描述】:

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

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

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

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

      } catch (Throwable t) {
      }
    }

更多 - 很清楚它的作用,但是我有一些问题:

1. Selector.select(selector) 以 500 毫秒超时执行选择。 为什么它不仅仅是一个阻塞调用?

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

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

提前致谢

【问题讨论】:

    标签: netty


    【解决方案1】:
    1. 我们使用基于时间的阻塞 Selector.select(..) 调用,因为我们还通过 processRegisterTaskQueue() 方法处理向工作人员注册新通道。如果我们不使用基于时间的调用,我们将面临放慢速度的风险。在最近的版本中,我们甚至将 Selector.select(..) 调用改为使用 10 毫秒。

    2. 查看 [1] 处的评论

    [1]https://github.com/netty/netty/blob/3/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorker.java#L202

    【讨论】:

    • 1.根据我的理解,阻塞选择器将在新连接到达的情况下解除阻塞,因此您不必进行基于时间的调用来调用 processRegisterTaskQueue。 2. 附件中的评论只讨论了wakenUp.get()。我想了解选择器必须被唤醒的原因?是否有多个线程在使用选择器?
    • 新连接在 Boss 线程上被接受,使用一个单独的选择器来处理 IO-Worker 用来处理连接的选择器。从 boss 选择器到 IO-Worker 选择器的切换由boss线程处理,该线程放置任务以将新通道注册到队列中的 IO-Worker,然后由 IO-Worker 处理。 IO-Worker 必须被唤醒才能处理队列。
    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多