【问题标题】:How Netty uses thread pools?Netty 如何使用线程池?
【发布时间】:2011-07-25 08:48:25
【问题描述】:

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

【问题讨论】:

    标签: java netty


    【解决方案1】:

    这是来自 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 的所有示例中,我都看到使用 cachedThreadPool 设置老板池。为什么不使用 singleThreadExecutor?有什么具体原因吗?在这个线程中提出这个问题而不是一个新问题,非常切中要害,因为已经提出了这个讨论。
    【解决方案2】:

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

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

    为什么?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2015-03-28
      • 2017-11-07
      • 2017-12-05
      • 2016-11-18
      • 1970-01-01
      • 2011-11-23
      相关资源
      最近更新 更多