Netty 如何使用线程池?
您能解释一下Netty如何使用线程池来工作吗?我是否正确地理解,有两种类型的线程池:老板和工人。老板用来做I/O,工人用来调用用户回调(消息接收)来处理数据?
您能解释一下Netty如何使用线程池来工作吗?我是否正确地理解,有两种类型的线程池:老板和工人。老板用来做I/O,工人用来调用用户回调(消息接收)来处理数据?
这是来自NioServerSocketChannelFactory文档
一个ServerSocketChannelFactory,它创建了一个基于服务器端NIO的ServerSocketChannel。它利用NIO引入的非阻塞I / O模式来有效地为许多数量的并发连接提供服务。
线程的工作原理
NioServerSocketChannelFactory 中有两种类型的线程;一个是老板线程,另一个是工作线程。Boss 线程
每个绑定的 ServerSocketChannel 都有自己的 boss 线程。例如,如果打开了两个服务器端口(如 80 和 443),则将有两个 boss 线程。boss 线程接受传入连接,直到端口未绑定。成功接受连接后,boss 线程会将接受的通道传递给 NioServerSocketChannelFactory 管理的工作线程之一。工作线程
一个 NioServerSocketChannelFactory 可以有一个或多个工作线程。工作线程在非阻塞模式下对一个或多个通道执行非阻塞读写。
在Nio模型中,bossThread负责所有有界套接字(监听套接字),workerThread负责接受套接字(包括IO和调用事件方法,如messageReceived)。
与 Netty Nio 实现 (3.2.4.Final) NioServerSocketChannelFactory 相关的说明。
工作线程池必须能够提供至少的工作线程数(当前默认为 2*内核数)。
为什么?
如果此实现,则每个工作线程都有自己的选择器循环,这意味着每个工作线程将“吃掉”一个线程以在选择器上睡觉。此外,该工作线程(和关联的线程)负责执行所有实际的写入和读取(包括管道上的触发事件,这意味着处理程序在该工作线程中执行)。
对于 boss 线程池,实际上线程池是不需要的,因为当前实现仅从中获取单个线程。该线程在接受连接后,该线程在服务器套接字的选择器上处于睡眠状态,该连接已注册到工作线程。从那一刻起,工人负责为这种联系服务。