【问题标题】:Netty architecture - questions about NioWorker loop againNetty 架构——再次关于 NioWorker 循环的问题
【发布时间】:2012-06-16 09:53:03
【问题描述】:

呃,这里有一个关于netty nioWorker的问题 Netty architecture - questions about NioWorker loop

但我有不同的关注点,我发现

processRegisterTaskQueue();
processEventQueue();
processWriteTaskQueue();

虽然这三个队列包含Runnable类型,但是调用run()方法

private void processWriteTaskQueue() throws IOException {
        for (;;) {
        final Runnable task = writeTaskQueue.poll();
        if (task == null) {
            break;
        }

        task.run();
        cleanUpCancelledKeys();
    }
}

表示handle queues同步,可能handler queues太长,无法及时处理processSelectedKeys?

顺便说一下,我写数据的时候,netty把数据推到writeBufferQueue,然后把一个写任务推到writeTaskQueue,然后在执行processWriteTaskQueue的时候处理这​​个任务

 if (channel.writeTaskInTaskQueue.compareAndSet(false, true)) {
            // "add" the channels writeTask to the writeTaskQueue.
            boolean offered = writeTaskQueue.offer(channel.writeTask);
            assert offered;
 }

为什么不直接在 Niowork 循环中处理数据?比如 processWriteBufferQueue()?

谁能解释一下?谢谢

【问题讨论】:

    标签: netty


    【解决方案1】:

    这篇文章有两个问题。

    第一个问题是:有没有可能handler队列太长,无法及时处理process SelectKeys()

    是的。但是,除非您的处理程序实现故意滥用,否则它似乎不会发生。

    第二个问题是:为什么写操作总是在I/O循环线程中进行?

    否则 1) 如果您从不同的线程写入,您将看到写入器线程之间的大量争用,2) 由于可能的竞争条件(连接重置等),您将看到各种套接字异常,以及 3) Netty 内部将变为处理这种情况更复杂。

    请注意,在 Netty 4 中线程模型变得更加严格,事件循环实现变得更加简单,所以您可能也想看看那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      相关资源
      最近更新 更多