Netty之EventLoop,EventLoopGroup,Channel

版权声明:士,不可以不弘毅,任重而道远 https://blog.csdn.net/superbeyone/article/details/85679641


Netty之EventLoop,EventLoopGroup,Channel

  1. 一個EventLoopGroup當中會包含一個或多個EventLoop.
  2. 一個EventLoop在它的整個生命週期當中都只會與唯一一個Thread進行綁定.
  3. 所有由EventLoop所處理的各種I/O事件都將在它所關聯的那個Thread上進行處理.
  4. 一個Channel在它的整個生命週期中只會註冊在一個EventLoop上.
  5. 一個EventLoop在運行過程當中,會被分配給一個或者多個Channel.

重要結論:

  • 在Netty中,Channel的實現一定是線程安全的;基於此,我們可以存儲一個Channel的引用,並且在需要向遠程端點發送數據時,通過這個引用來調用Channel相應的方法;即便當時有很多線程都在使用它也不會出現線程問題;而且,消息一定會按照順序發送出去。
  • 我們在業務開發中,不要將長時間執行的耗時任務放入到EventLoop的執行隊列中,因爲它將會一直阻塞該線程所對應的所有Channel上的其他執行任務,如果我們需要進行阻塞調用或是耗時的操作(實際開發中很常見),那麼我們就需要使用一個專門的EventExecutor(業務線程池)。

通常會有兩種實現方式:

  1. ChannelHandler的回調方法中,使用自己定義的業務線程池,這樣就可以實現異步調用。
  2. 藉助於Netty提供的向ChannelPipeline添加ChannelHandler時調用的addLast方法來傳遞EventExecutor

說明:

默認情況下(調用addLast(handler)),ChannelHandler中回調方法都是由I/O線程所執行,如果調用了ChannelPipeline addLast(EventExecutorGroup group, ChannelHandler... handlers);方法,那麼ChannelHandler中的回調方法就是由參數中的group線程組來執行的。

猜你喜欢

转载自blog.csdn.net/superbeyone/article/details/85679641