7 EventLoop 和 线程模型

 

 这一章需要JUC相关的知识。

 

 

 

事件/任务的执行顺序 事件和任务是以先进先出(FIFO)的顺序执行的。这样可以通过保证字

节内容总是按正确的顺序被处理,消除潜在的数据损坏的可能性。

 

 

我们之前已经阐明了不要阻塞当前I/O 线程的重要性。我们再以另一种方式重申一次:“永

远不要将一个长时间运行的任务放入到执行队列中,因为它将阻塞需要在同一线程上执行的任何

其他任务。”如果必须要进行阻塞调用或者执行长时间运行的任务,我们建议使用一个专门的

EventExecutor。(见6.2.1 节的“ChannelHandler 的执行和阻塞”)。

 

 

EventLoopGroup 负责为每个新创建的Channel 分配一个EventLoop。在当前实现中,
使用顺序循环(round-robin)的方式进行分配以获取一个均衡的分布,并且相同的EventLoop
可能会被分配给多个Channel。(这一点在将来的版本中可能会改变。)
一旦一个Channel 被分配给一个EventLoop,它将在它的整个生命周期中都使用这个
EventLoop(以及相关联的Thread)。请牢记这一点,因为它可以使你从担忧你的Channel-
Handler 实现中的线程安全和同步问题中解脱出来。
另外,需要注意的是,EventLoop 的分配方式对ThreadLocal 的使用的影响。因为一个
EventLoop 通常会被用于支撑多个Channel,所以对于所有相关联的Channel 来说,
ThreadLocal 都将是一样的。这使得它对于实现状态追踪等功能来说是个糟糕的选择。然而,
在一些无状态的上下文中,它仍然可以被用于在多个Channel 之间共享一些重度的或者代价昂
贵的对象,甚至是事件。

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-06-09 23:26  lakeslove  阅读(181)  评论(0编辑  收藏  举报