当前位置: 首页 > 知识库问答 >
问题:

Netty 4-EventLoopGroup-EventLoop-EventExecutor-线程关联

全流觞
2023-03-14

我正在研究Netty 4.0.0.Alpha5代码,以了解如何处理线程。我还阅读了Netty 4新线程模型的介绍,网址为http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-第2-34页。

据我所知,目标是:

  • 线程关联,将通道粘贴到单个线程(EventLoop)。我想,采取这种方法是为了减少缓存未命中,并改善NUMA硬件上的情况

所以,我怀疑我的解释是否正确。如果我是对的,那么下面的问题出现了:

  • 在ChannelPipeline中有一个可能长时间运行的ChannelHandler(例如数据库操作)可能会阻塞EventLoop(Thread),因此会阻塞分配给同一EventLoop的所有其他Channel(线程)。这个解释是真的吗
  • 为了避免这个问题,我可以为长时间运行的ChannelHandler使用EventExecutor,但根据文档(参见上面的链接),一个Channel再次被卡在其EventExectuor内的单个Thread上,因此可能会再次阻塞分配给同一Thread的其他Channel(在EventExecuter内)。我错过了什么还是真的

我只是想了解为什么事情是这样的,并获得一些关于Netty 4设计意图的信息。

共有2个答案

帅煌
2023-03-14

你的两点在Netty 3上也是如此。

Netty 3有一个老板和工人线程的概念。boss线程负责接受新的连接,然后将其卸载到worker线程。创建< code > NioServerSocketChannelFactory 时,工作线程的数量是可配置的。

现在Netty 4已经分别用父事件循环和子事件循环替换了这些boss和worker线程。但是核心思想保持不变:为了摆脱每个连接一个线程的模型,你必须为一个线程分配多个连接。< br >因此,当您创建服务器时,将有一个固定的N线程池专门用于处理连接。如果连接数低于N,那么每个线程不会有多于一个的连接。另一方面,如果您有N个以上的连接,一些线程将管理多个连接。这是以循环方式完成的,请查看multithreadeventexecutorgroup . next()

鲁单弓
2023-03-14

这两个问题都是正确的。通过将处理程序分配给非 I/O 事件组,可以防止 I/O 线程被长时间运行的操作(如数据库访问)阻塞。您可以指定具有较大大小的事件可执行文件组,具体取决于处理程序执行的操作。它与通常的线程池没有太大区别。如果线程池繁忙,则执行长时间运行的任务的任何尝试都将排队。

 类似资料:
  • 本章介绍 线程模型的总览 EventLoop 并发 任务执行 任务调度 线程模型定义了应用或者框架如何执行你的代码,所以选择线程模型极其重要。Netty 提供了一个简单强大的线程模型来帮助我们简化代码。所有 ChannelHandler,包括业务逻辑,都保证由一个 Thread 同时执行特定的 Channel。这并不意味着Netty不能使用多线程,只是 Netty 限制每个Channel 都由一个

  • dubbo 2.5.6版本新增了对netty4通信模块的支持,启用方式如下 provider端: <dubbo:protocol server="netty4" /> 或 <dubbo:provider server="netty4" /> consumer端: <dubbo:consumer client="netty4" /> 注意 provider端如需不同的协议使用不同的通信层框架,

  • 事件循环所做的正如它的名字所说的。它运行在一个循环里,直到它的终止。这符合网络框架的设计,因为他们需要在一个循环为一个特定的连接运行事件。这不是 Netty 发明新的东西;其他框架和实现已经这样做了。 下面的清单显示了典型的 EventLoop 逻辑。请注意这是为了更好的说明这个想法而不是单单展示 Netty 实现本身。 Listing 14.1 Execute task in EventLoop

  • 我正在尝试基于Netty构建一个UDP服务器,以便根据客户端订阅(在订阅设置之前交换一些UDP请求/响应消息)将事件(大约每秒500个事件)连续发布到不同的客户端。 设计是由Java执行器创建一些生产者/消费者线程。生成消息后,使用者线程将其写入UDP通道。 观察到,服务器端只有一个EventLoop线程在为该UDP通道工作,并且它非常忙于向套接字写入消息,因此对第二个和更高版本客户端的订阅请求的

  • 问题内容: 我有一个Python程序,当我使用退出应用程序时 ,脚本不会关闭。我的过程仍显示在运行的过程中。 为什么python线程不能关闭? 问题答案: 您需要将该线程设为守护程序线程。为此,请在调用线程的init之后添加以下行 当只有守护程序线程处于活动状态时,程序将退出,主线程当然是非守护程序的

  • 本文向大家介绍Eventloop的理解?相关面试题,主要包含被问及Eventloop的理解?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 任务队列中,在每一次事件循环中,macrotask只会提取一个执行,而microtask会一直提取,直到microsoft队列为空为止。 也就是说如果某个microtask任务被推入到执行中,那么当主线程任务执行完成后,会循环调用该队列任务中的下一个任