代码之家  ›  专栏  ›  技术社区  ›  St.Antario

Netty中的I/O线程是什么?

  •  0
  • St.Antario  · 技术社区  · 6 年前

    我读过 the article 关于中的线程模型 Netty 还有一个关于 IO 在内蒂。考虑以下因素 ServerBootstrap 宣言:

    NioEventLoopGroup workerGroup = new NioEventLoopGroup(16)
    new ServerBootstrap()
    .childHandler(
         new ChannelInitializer<Channel> {
              override def initChannel(ch: Channel) = ch.pipeline()
                .addLast(new ChannelDuplexHandler)   // Without specifying event-loop-group
                .addLast(workerGroup, new HttpRequestDecoder()) //event group specified
        }
    

    据我所知 ChannelDuplexHandler 将直接从IO线程调用。

    问题是如何配置 IO -线程(更改IO线程的数量,可能重写IO线程以定义自定义中断行为)?

    我可以将我的事件循环组设置为IO组吗。我是说

    NioEventLoopGroup myIoGroup = new NioEventLoopGroup(16); 
                                  // Is it possible to make it IO-group?
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Norman Maurer    6 年前

    我对你的问题有点困惑,所以我希望这能回答这个问题。。。。所使用的线程 EventLoopGroup 是“IO线程”,传入的数字是要使用的“IO线程”数。每个线程将处理0-n个通道。要增加IO线程的数量,可以指定一个不同的数字,然后在此处指定“16”。

    每个通道仅使用一个“IO线程”。如果要确保 ChannelHandler 将从通常创建的IO线程中卸载 DefaultEventExecutorGroup 并在添加 ChannelHandler . 这个 EventExecutorGroup 应在不同的 Channel 实例以充分利用线程tho。

    类似这样:

    NioEventLoopGroup workerGroup = new NioEventLoopGroup(16)        
    EventExecutorGroup executorGroup = new DefaultEventExecutorGroup(numberOfThreads);
    new ServerBootstrap()
        .childHandler(
             new ChannelInitializer<Channel> {
                 override def initChannel(ch: Channel) = ch.pipeline()
                     .addLast(new ChannelDuplexHandler)   // Without specifying event-loop-group
                     .addLast(executorGroup, new HttpRequestDecoder()) 
    }