Netty架构 - 再次提出有关NioWorker循环的问题

时间:2012-06-13 12:33:25

标签: netty

呃,这是关于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();
    }
}

它意味着处理队列同步,处理器队列可能太长,并且不能及时处理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()?

有人可以解释一下吗?感谢

1 个答案:

答案 0 :(得分:0)

这篇文章有两个问题。

第一个问题是:处理程序队列可能太长而且无法及时process SelectKeys()吗?

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

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

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

请注意,线程模型变得更加严格,并且在Netty 4中事件循环实现变得更加简单,因此您可能也希望在那里查看。