netty:为什么write()必须在分配给通道的Eventloop线程中执行?

时间:2018-06-16 09:43:16

标签: multithreading netty

应用程序在频道之间交换数据很常见。

例如,对于代理服务器,每个入站连接都将与出站连接和它们之间交换的数据相关联。在这种情况下,我知道我可以构建一个客户端BootStrap并执行b.group(inboundChannel.eventLoop());。然后两个通道都可以在同一个线程中处理。

但是入站渠道之间的数据交换呢?聊天室是典型案例。耦合是任意的,对于恰好具有不同EventLoop线程的两个通道,它们将支付不必要的上下文切换开销。

所以我很困惑为什么存在这样的规则?我是否可以将数据写入Channel套接字(可能具有锁定保持),如果写入可以在任何调用线程中进行非阻塞(OS套接字缓冲区具有可用空间或对等体消耗速度快),并且如果它会阻塞,然后我们可以触发EventLoop线程将写位注册到选择器吗?

1 个答案:

答案 0 :(得分:0)

它只是在Netty中完成的设计选择,它还简化了自定义ChannelHandler的编写。总是调度到EventLoop入站和出站处理程序在执行这些语句时具有相同的语义,因此用户基本上可以将其处理程序编写为“单线程”。

由于这是netty的“核心”,因此无法改变这一点。