2012-01-04 57 views
3

在netty中,流经通道流水线的事件按顺序发生,因为每个通道只能有效地分配给一个线程,并且每个处理器依次相互调用。这是有道理的,并缓解许多同步问题。了解Netty对线程的使用

但是,如果您使用IdleStateHandler,那么在读取源代码时,看起来channelIdle事件将在定时器线程(例如HashedWheelTime所使用的线程)中“处理”。

是这种情况还是我错过了什么?如果是这样,这是否意味着idlestate事件和IO事件(例如messageRecieved事件)可能同时在同一个通道上执行?

另外,因为我可以保存ChannelHandler ctx并将其用于不同的线程以“写入”某个通道,因此在一个线程中下游事件并且同时在另一个线程中上行同一个频道?

最后哪个线程做ChannelFutures执行?

所有这些用例都是完全可以接受的,根本不是对Netty的批评,实际上我非常喜欢这个库,并在各处使用它。它只是当我试图用它做更多更复杂的事情时,我想更多地了解它如何在引擎盖下工作,这样我就可以确保我使用正确和恰当的量(不多也不少)同步(锁定)。

回答

4

是可以同时触发channelIdle事件和下游/上游事件。因此,如果您的处理程序确实实施了三个中的至少两个,则需要添加适当的同步。我想我们应该让中的javadoc更加清晰..

现在其他问题..

你可以从你想太多每个线程调用Channel.write(......)所以它可能只需将它存储在某个地方,并随时致电写入。这也给出了“限制”,你需要对“下游”处理程序进行适当的同步。

ChannelFutures从工作线程内执行。

+0

感谢您的答案,正是我需要知道的。 – user1129382 2012-01-04 22:38:25

1

但是,如果您使用IdleStateHandler,则从读取源代码后,看起来channelIdle事件将在定时器线程(例如HashedWheelTime所使用的线程)中“处理”。

是这种情况还是我错过了什么?如果是这样,这是否意味着idlestate事件和IO事件(例如messageRecieved事件)可能同时在同一个通道上执行?

是的,你已经错过了在Netty中提供指示事件执行的概念,如果你不是在管道与OrderedMemoryAwareThreadPoolExecutor巡航能力ExecutionHandler,你不能有有序事件执行,从IdleStateHandler专门信道状态的事件。

而且,如我可以节省的ChannelHandler CTX,并用它在不同的线程到“写”到例如信道,因此也有一个事件在相同的在一个线程去下游和上游在另一个线程时间在同一频道?

是它的正确。

如果您希望在下游执行有序事件执行,则您有一个带OrderedMemoryAwareThreadPoolExecutor的下游执行处理程序impl。

最后哪个线程做ChannelFutures执行?

的由奥约/仁王工作线程执行,

但是如果你往下流处理器消耗一些类型的事件和发射其他类型的事件的下面的下游,那么你的下游处理程序可以选择处理未来的执行。这可以通过获得未来形式的下游事件和呼吁

future.setSuccess() 
+0

感谢您的阐述:) – user1129382 2012-01-04 22:38:57