最近在学netty,关于netty channel,socket和线程关系的疑问,求解答

在用java socket进行编程的时候,往往对于多个客户端响应的话,一个socket连接创建一个线程或者一个线程处理所有的socket 连接。在netty中是一个EventLoopGroup线程组去处理sokcet连接。我一直不理解的是,在netty中一个channel创建后,是不是也会创建一个线程。如果是的话,客户端增多的话,线程数也会上去。如果不是的话,那这个channel是如何保持的,因为后续会通过这个channel发送消息

阅读 10.1k
6 个回答
一个socket连接创建一个线程或者一个线程处理所有的socket 连接。在netty中是一个EventLoopGroup线程组去处理sokcet连接。
我一直不理解的是,在netty中一个channel创建后,是不是也会创建一个线程。如果是的话,客户端增多的话,线程数也会上去。
  • 这里题主把EventLoopGroup想的太深奥了,EventLoopGroup接口的继承层次确实有点深,我刚开始看源码时,就发现点击父类,点进去,发现父类还有父类,…… 有点怵。就把它看成是一个线程池就可以了,类比JDBC连接池。
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
  • 以上是Netty服务端的模板代码,bossGroup就用一个线程来处理远程客户端的连接,workerGroup拥有的线程数也就2倍的cpu核心数。
  • 客户端连接进来,由bossGroup负责接待,再转交给workerGroup来处理具体的业务。
  • 假如cpu是8核的,那么上面总共1 + 2*8 = 17个线程来处理所有的客户端调用。客户端再多也就这么17个线程来服务。
  • 这要求编写的Netty代码是快速返回的,异步事件驱动的。耗时的操作也要先快速返回未完成,完成时再触发事件通知,或者让客户端每隔1秒调用一次直到返回数据。

不会啊 ,当然是一大堆SocketChannel由1个线程来处理,这些线程都会被注册到一个Selector。

当然不是的,你可以先看一下 UNIX网络编程 的第6章IO复用,具体实现,你可以去理解什么 reactor 模式,==》reactor 模式,在推荐一个pdf文件 nio pdf .

说几点重要的注意点:

1.netty中有一个核心的理念就是减少线程这种消耗资源的操作发生,那么他的策略就是线程来共享。

2. I/o是阻塞操作,所以再用netty默认的线程模型的时候,所有业务都应该快速返回,否则就应该用用户定制的任务执行框架(要在初始化的时候指定) 。

摘抄一下源码:

            
            
            DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
            "io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
            

EventLoop代表一个Thread, EventLoopGroup就是一个EventLoop的容器,里面包含多个EventLoop,其数量就是有初始化参数决定的,见上面的代码。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏