page contents

netty多线程处理Channel问题

Pack 发布于 2020-02-06 18:07
阅读 372
收藏 0
分类:Java开发

再看netty源码的时候有一个问题没有想明白,就是看源码的时候客户端BootStrap创建了一个NioSocketChannel实例,然后通过调用策略的next方法从EventLoopGroup中给NioSocketChannel分配一个EventLoop进行处理,并且NioSocketChannel之后所有的操作都由这一个Eventloop来处理,在初始化的时候EventLoopGroup比如设置为4,但是客户端创建的NioSocketChannel实例只会与其中一个EventLoop进行绑定,那岂不是其他的EventLoop都用不上了? 还有服务器端的NioServerSocketChannel,也是将该实例绑定到了bossGroup中的一个EventLoop进行处理,那岂不是bossGroup中的其他EventLoop也用不上了吗?这一点没太理解,有可能源码看的有所疏漏,但是目前看到的实现是这样的,所以说给客户端EventLoopGroup和服务端bossGroup设置多线程的意义是什么?还恳请各路大佬帮助解答。

264
Pack
Pack

服务端boss线程分配一个就行,分配多了也不起作用,因为他是每个端口绑定一个线程.客户端是进来一个NioSocketChannel 利用EventExecutorChooser选择器,选择一个EventLoop绑定到NioSocketChannel 上。

具体代码:服务端 channelHandler ServerBootstrapAcceptor.channelRead读取连接事件,调用childGroup.register ,调用到 MultithreadEventExecutorGroup.next()该方法调用选择器EventExecutorChooser从childGroup里选择一个EventLoop。最后走到AbstractChannle$AbstractUnsafe内部类的注册方法register,该方法内部把EventLoop 绑定到AbstractChannle的属性上:AbstractChannel.this.eventLoop = eventLoop。所以整个流程就是连接进来从childGroup里选一个EventLoop轮询器绑定到NioSocketChannel上。意思是你这个连接的事件就归选出来的EventLoop管了。childGroup的轮询器组EventLoop分摊了多个客户端连接。可以参考一下netty的作业:20190622_Netty核心之EventLoop与Pipeline

请先 登录 后评论