了解Netty对线程的使用

3
在Netty中,通过通道管道流动的事件按顺序发生,因为每个通道只被分配给一个线程,并且每个处理程序依次调用对方。这样做很有意义,可以减少许多同步问题。
然而,如果使用IdleStateHandler,根据我对源代码的理解,似乎channelIdle事件将在Timers线程的上下文中进行处理(例如,HashedWheelTime正在使用该线程)。
这是事实吗,还是我漏掉了什么?如果是这种情况,这是否意味着可能在同一时间在同一通道上执行空闲状态事件和IO事件(例如,messageReceived事件)?
此外,我可以保存ChannelHandler ctx,并在不同的线程中使用它来“写入”通道,从而在同一通道上同时在一个线程中向下游传递事件并在另一个线程中向上游传递事件吗?
最后,ChannelFutures在哪个线程中执行?
所有这些用例都是完全可以接受的,不是对Netty的批评,我实际上非常喜欢这个库并随处使用。只是随着我尝试用它做更复杂的事情,我想更多地了解其内部工作原理,以便确保我正在使用适当的并且恰到好处的同步(锁定)。
2个回答

4

是的,channelIdle事件和下行/上行事件可能同时触发。因此,如果您的处理程序至少实现了其中两个,则需要添加适当的同步。我想我们应该在javadocs中更清楚地表明这一点。

现在是其他问题...

您可以从任何线程调用Channel.write(...)。因此,可以将其存储在某个位置并在需要时调用write。这也给出了“下行”处理程序需要适当同步的“限制”。

ChannelFutures是从工作线程内执行的。


1
然而,如果您使用IdleStateHandler,从我阅读源代码的角度来看,似乎channelIdle事件将在计时器线程的上下文中“处理”(例如HashedWheelTime正在使用的线程)。
这是情况吗?还是我错过了什么?如果是这种情况,这是否意味着可能会在同一通道上同时执行空闲状态事件和IO事件(例如messageRecieved事件)?
是的,您错过了Netty中可用的有序事件执行概念。如果您在管道中没有ExecutionHandler和OrderedMemoryAwareThreadPoolExecutor,则无法进行有序事件执行,特别是来自IdleStateHandler的通道状态事件。
此外,如果您想在下游进行有序事件执行,您必须使用OrderedMemoryAwareThreadPoolExecutor实现下游执行处理程序。
另外,ChannelFutures在哪个线程中执行?
是的,您说得对。
最后,ChannelFutures在哪个线程中执行?

它们由 Oio/Nio 工作线程执行,

但是,如果您的下游处理程序正在消耗某种类型的事件并向下游触发另一种类型的事件,则您的下游处理程序可以选择处理未来的执行。这可以通过获取下游事件的 future 并调用来完成。

future.setSuccess()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接