EventLoopGroup 与Reactor 关联
我們介紹了三種Reactor 的線程模型, 那么它們和NioEventLoopGroup 又有什么關系呢? 其實, 不同的設置NioEventLoopGroup 的方式就對應了不同的Reactor 的線程模型。
1、單線程模型,來看下面的應用代碼:
EventLoopGroup bossGroup = new NioEventLoopGroup(1); ServerBootstrap server = new ServerBootstrap(); server.group(bossGroup);注意,我們實例化了一個NioEventLoopGroup,然后接著我們調用server.group(bossGroup)設置了服務器端的EventLoopGroup。有人可能會有疑惑;我記得在啟動服務器端的Netty 程序時, 需要設置bossGroup 和workerGroup,為何這里只設置一個bossGroup?其實原因很簡單,ServerBootstrap 重寫了group 方法:
public ServerBootstrap group(EventLoopGroup group) {return group(group, group); }因此當傳入一個group 時,那么bossGroup 和workerGroup 就是同一個NioEventLoopGroup 了。這時,因為bossGroup 和workerGroup 就是同一個NioEventLoopGroup,并且這個NioEventLoopGroup 線程池數量只設置了1個線程,也就是說Netty 中的Acceptor 和后續的所有客戶端連接的IO 操作都是在一個線程中處理的。那么對應到Reactor 的線程模型中,我們這樣設置NioEventLoopGroup 時,就相當于Reactor 的單線程模型。
2、多線程模型,再來看下面的應用代碼:
EventLoopGroup bossGroup = new NioEventLoopGroup(128); ServerBootstrap server = new ServerBootstrap(); server.group(bossGroup);從上面代碼中可以看出,我們只需要將bossGroup 的參數就設置為大于1 的數,其實就是Reactor 多線程模型。
3、主從線程模型,到這里相信大家都已經想到了, 實現主從線程模型的代碼如下:
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup);bossGroup 為主線程,而workerGroup 中的線程是CPU 核心數乘以2,因此對應的到Reactor 線程模型中,我們知道, 這樣設置的NioEventLoopGroup 其實就是Reactor 主從多線程模型。
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的EventLoopGroup 与Reactor 关联的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈Reactor 线程模型
- 下一篇: EventLoopGroup 的实例化