gpt4 book ai didi

java - 理解 Netty 对线程的使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:54:46 24 4
gpt4 key购买 nike

在 netty 中,流经 channel 管道的事件按顺序发生,因为每个 channel 实际上只分配给一个线程,并且每个处理程序依次相互调用。这是有道理的,并缓解了许多同步问题。

但是,如果您使用 IdleStateHandler,从我对源代码的阅读来看,似乎 channelIdle 事件将在计时器线程(例如 HashedWheelTime 使用的线程)的上下文中“处理”。

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

此外,因为我可以保存 ChannelHandler ctx 并在不同的线程中使用它来“写入” channel ,例如,因此也有一个事件在一个线程中同时在另一个线程中向下游和在另一个线程中向上游同一个 channel ?

ChannelFutures最后在哪个线程执行?

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

最佳答案

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

现在是其他问题..

您也可以从您想要的每个线程调用 Channel.write(...)。因此可以将它存储在某个地方并在需要时调用 write。这也提供了您需要为“下游”处理程序进行适当同步的“限制”。

ChannelFutures 在工作线程中执行。

关于java - 理解 Netty 对线程的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8723421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com