呃,这是关于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()?
有人可以解释一下吗?感谢
答案 0 :(得分:0)
这篇文章有两个问题。
第一个问题是:处理程序队列可能太长而且无法及时process SelectKeys()
吗?
是。但是,除非您的处理程序实现故意滥用,否则似乎不会发生。
第二个问题是:为什么写操作总是在I / O循环线程中执行?
否则1)如果你从不同的线程写入,你会看到写入器线程之间存在很多争用,2)由于可能的竞争条件(连接重置等),你会看到各种套接字异常,以及3)Netty内部将成为处理这种情况比较复杂。
请注意,线程模型变得更加严格,并且在Netty 4中事件循环实现变得更加简单,因此您可能也希望在那里查看。