0

呃,这里有一个关于netty nioWorker Netty架构的问题——关于NioWorker循环的问题

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

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?</p>

顺便说一下,当我写数据的时候,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()?

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

4

1 回答 1

0

这篇文章有两个问题。

第一个问题是:是否有可能处理程序队列太长而无法及时执行process SelectKeys()

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

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

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

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

于 2012-06-15T01:51:56.033 回答