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

标签 netty

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

据我了解,目标是:

  • 线程相似性,将Channel坚持到单个线程(EventLoop)。我猜想这种方法是为了减少高速缓存未命中并改善NUMA硬件上的情况。

  • 因此,我想知道我的解释是否正确。如果我是对的,那么就会出现以下问题:
  • 在ChannelPipeline中可能长时间运行的ChannelHandler(例如数据库操作)可能会阻塞EventLoop(线程),因此将阻塞分配给同一EventLoop(线程)的所有其他Channel。这种解释是真的吗?
  • 为了避免该问题,我可以对长时间运行的ChannelHandler使用EventExecutor,但是根据文档(请参见上面的链接),某个Channel再次卡在其EventExectuor内的单个线程中,因此可能再次阻塞分配了该Channel的其他Channel。同一线程(在EventExecutor中)。我错过了什么吗?

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

    最佳答案

    对两个问题都是如此。通过为非I / O事件组分配处理程序,可以防止长时间运行的操作(例如数据库访问)阻止I / O线程。您可以根据处理程序的操作指定较大的EventExecutorGroup。它与通常的线程池没有太大区别。如果线程池繁忙,则将执行长时间运行任务的任何尝试排队。

    关于netty - Netty 4-EventLoopGroup-EventLoop-EventExecutor-线程关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12928723/

    相关文章:

    java - 如何阅读 Netty 日志

    netty - 一个netty bootstrap可以连接多台主机吗

    html - 使用 Netty HTTP2 实现支持服务器发送事件

    java - 在不同的 ChannelPipeline 中共享 ExecutionHandler

    java - Netty 4 SSE 更新事件

    java - "lexically-ordered"base64 的定义是什么?为什么 RFCC-1940 显然是规范引用?

    websocket - Netty:正确关闭WebSocket

    java - 在Netty NIO中动态添加线程到ExecutorService

    spring-webflux - Netty Http 客户端连接池

    java - Netty 4代理: howto stop reading after the first PDU until the next read() call?