代码之家  ›  专栏  ›  技术社区  ›  kingluo

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

  •  1
  • kingluo  · 技术社区  · 7 年前

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

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

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

    所以我很困惑为什么会有这样的规则?我们能不能把数据写到 Channel 如果在任何调用线程中都可以不阻塞地完成写操作(操作系统套接字缓冲区有空闲空间或对等机消耗速度很快),如果它阻塞了,我们就可以触发 事件循环 将写入位注册到选择器的线程?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Norman Maurer    7 年前

    这只是一个在netty中完成的设计选择,也简化了定制的编写 ChannelHandler 总是派去 EventLoop 入站和出站处理程序在执行时具有相同的语义,因此用户基本上可以将其处理程序编写为“单线程”。

    因为这是内蒂的“核心”,没有办法改变这一点。