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;
}