Netty架构——关于NioWorker循环的问题

Netty架构——关于NioWorker循环的问题,netty,Netty,呃,这里有一个关于内蒂的问题 但我有一个不同的重点,我发现 processRegisterTaskQueue(); processEventQueue(); processWriteTaskQueue(); 虽然这三个队列都是可运行类型,但调用run()方法 这意味着句柄队列已同步,是否可能句柄队列太长,并且无法及时执行processSelectedKeys 顺便说一下,当我写入数据时,netty会将数据推入writeBufferQueue,并将写入任务推入writeTaskQueue,然后

呃,这里有一个关于内蒂的问题

但我有一个不同的重点,我发现

processRegisterTaskQueue();
processEventQueue();
processWriteTaskQueue();
虽然这三个队列都是可运行类型,但调用run()方法

这意味着句柄队列已同步,是否可能句柄队列太长,并且无法及时执行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()


有人能解释一下吗?谢谢

这篇文章有两个问题

第一个问题是:是否处理程序队列太长,无法及时执行
processselectkeys()

对。然而,除非处理程序实现故意滥用,否则它似乎不会发生

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

否则1)如果从不同的线程写入,您将看到写入线程之间的大量争用;2)由于可能的争用条件(连接重置等),您将看到各种套接字异常;3)Netty internal将变得更复杂,无法处理此类条件

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

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