【发布时间】:2011-07-25 08:48:25
【问题描述】:
你能解释一下 Netty 是如何使用线程池工作的吗?我是否理解正确,有两种线程池:老板和工人。 boss用来做I/O,worker用来调用用户回调(messageReceived)处理数据?
【问题讨论】:
你能解释一下 Netty 是如何使用线程池工作的吗?我是否理解正确,有两种线程池:老板和工人。 boss用来做I/O,worker用来调用用户回调(messageReceived)处理数据?
【问题讨论】:
这是来自 NioServerSocketChannelFactory 文档
一个ServerSocketChannelFactory,它 创建一个基于 NIO 的服务器端 服务器套接字通道。它利用 非阻塞 I/O 模式 与 NIO 一起推出服务于许多 并发连接数 有效率的。
线程如何工作
有两种类型 中的线程数 NioServerSocketChannelFactory;一个是 boss线程,另一个是worker 线。老板线程
每个绑定 ServerSocketChannel 有自己的boss 线。例如,如果您打开了两个 服务器端口,例如 80 和 443,您 将有两个老板线程。老板 线程接受传入的连接 直到端口未绑定。一旦 连接被成功接受, boss线程通过了接受 通向其中一个工作线程的通道 NioServerSocketChannelFactory 管理。工作线程
一 NioServerSocketChannelFactory 可以有 一个或多个工作线程。一位工人 线程执行非阻塞读取和 为一个或多个频道写一个 非阻塞模式。
在 Nio 模型中,bossThread 负责所有有界套接字(listen socket),workerThread 负责 Accepted-socket(包括 IO 和调用 messageReceived 等事件方法)。
【讨论】:
Netty Nio 实现(3.2.4.Final)NioServerSocketChannelFactory 相关说明。
工作线程池必须能够提供至少 Number of Workers 线程(当前默认为 2*number of cores)。
为什么?
在这种实现的情况下,每个工作人员都有自己的选择器循环,这意味着每个工作人员将“吃掉”一个线程以在选择器上休眠。此外,该工作者(和相关线程)负责执行所有实际的写入和读取(包括在管道上触发事件,这意味着处理程序在该工作者线程中执行)。
如果是boss线程池,实际上线程池是不需要的,因为当前实现只从它获取一个线程。在接受连接后,该线程大部分时间都在服务器套接字的选择器上休眠,该连接已向工作人员注册。从那一刻起,worker 负责为该连接提供服务。
【讨论】: