2011-03-29 132 views
28

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

回答

26

这是从文件NioServerSocketChannelFactory

甲ServerSocketChannelFactory其中 创建一个服务器端基NIO 的ServerSocketChannel。它利用与NIO一起引入的 非阻塞I/O模式为多个并发连接 高效地提供服务。

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

老板线程
每个绑定 的ServerSocketChannel都有自己的老板 线程。例如,如果您打开两个 服务器端口(如80和443),则您的 将具有两个凸台线程。老板 线程接受传入连接 ,直到端口被解除绑定。一旦 连接成功接受,老板线程将接受的 通道传递给NioServerSocketChannelFactory 管理的工作线程之一 。

工作线程
一个 NioServerSocketChannelFactory可以有 一个或多个工作线程。一名工作人员 线程执行非阻塞式读取,并在 非阻塞式模式下为一个或多个通道写入 。

在Nio模型中,bossThread处理所有有界的套接字(listen socket),workerThread保管接受套接字(包含IO和call事件方法,如messageReceived)。

+0

这就是我的理解。但是,在Netty的所有示例中,我都看到使用cachedThreadPool设置老板池。为什么不使用单线程执行程序?有什么特别的理由吗?在这个线程中提出这个问题,而不是一个新的问题,非常重要,因为这个讨论已经提出。 – 2017-03-31 07:45:21

14

与Netty Nio实现(3.2.4.Final)相关的描述NioServerSocketChannelFactory。

工作线程池必须能够交付至少工作者线程数(当前默认2 *内核数)。

为什么?

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

在老板线程池的情况下,实际上线程池是不需要的,因为当前实现只从它获取一个线程。该线程大多数时间在服务器套接字的选择器上休眠,在接受连接之后,该连接已注册到worker。从那时起,工人就负责为这种关系提供服务。