43

你能解释一下Netty是如何使用线程池工作的吗?我是否理解正确,有两种线程池:老板和工人。Boss 用来做 I/O,worker 用来调用用户回调(messageReceived)来处理数据?

4

2 回答 2

35

这是来自 NioServerSocketChannelFactory 文档

一个 ServerSocketChannelFactory,它创建一个基于服务器端 NIO 的 ServerSocketChannel。它利用 NIO 引入的非阻塞 I/O 模式来有效地服务于许多并发连接。

线程如何工作
NioServerSocketChannelFactory 中有两种类型的线程;一个是老板线程,另一个是工作线程。

Boss 线程
每个绑定的 ServerSocketChannel 都有自己的 Boss 线程。比如你打开了80、443等两个服务器端口,就会有两个boss线程。老板线程接受传入的连接,直到端口未绑定。一旦成功接受连接,boss 线程将接受的 Channel 传递给 NioServerSocketChannelFactory 管理的工作线程之一。

工作线程
一个 NioServerSocketChannelFactory 可以有一个或多个工作线程。工作线程以非阻塞模式对一个或多个 Channel 执行非阻塞读写。

在 Nio 模型中,bossThread 负责所有有界套接字(listen socket),workerThread 负责 Accepted-socket(包括 IO 和调用 messageReceived 等事件方法)。

于 2011-03-29T15:39:05.453 回答
18

Netty Nio 实现(3.2.4.Final)NioServerSocketChannelFactory 相关说明。

工作线程池必须能够提供至少 Number of Workers 线程(当前默认为 2*number of cores)。

为什么?

在这种实现的情况下,每个工作人员都有自己的选择器循环,这意味着每个工作人员将“吃掉”一个线程以在选择器上休眠。此外,该工作者(和相关线程)负责执行所有实际的写入和读取(包括在管道上触发事件,这意味着处理程序在该工作者线程中执行)。

在boss线程池的情况下,实际上线程池是不需要的,因为当前实现只从它获取一个线程。在接受连接后,该线程大部分时间都在服务器套接字的选择器上休眠,该连接已向工作人员注册。从那一刻起,工人负责为该连接提供服务。

于 2011-05-17T14:22:00.280 回答