0

我正在使用 Netty4 创建一个需要服务多个客户端连接的服务器。ServerBootstrap 由 Parent 和 worker 线程组构成。根据 ServerBootStrap.group() 方法的文档,它

“为父(接受者)和子(客户端)设置EventLoopGroup。这些EventLoopGroup用于处理SocketChannel和Channel的所有事件和IO。”

据我了解, ParentExecutor 组将处理任何传入连接并将其传递给 Child Executor 组以执行。所以为了服务许多客户,我有以下设置

final ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup(Runtime.getRuntime()
            .availableProcessors() * 3))
    .channel(NioServerSocketChannel.class)
    .childHandler(new MyInitializer());

现在的问题是,我的 Handler 中的以下方法是否会在子 executor 组上执行。我怀疑它是通过 SingleThreadEventExecutor 以单线程方式处理的?

protected void channelRead0(final ChannelHandlerContext ctx, final AppMessage msg)
        final AppMessage msg) throws Exception {
4

2 回答 2

1

子组也称为工作组,实际上是由 Netty 创建的一个线程(在 Netty 中称为 EventLoop)池。默认 NioEventLoopGroup 的池大小为Runtime.getRuntime().availableProcessors() * 2). 每次连接到来时,Netty 都会从子组中安排一个线程(又名 EventLoop)来处理通道和消息传输等。属于 ChannelPipeline 的所有处理程序都将在该线程中执行。

于 2016-03-18T06:00:11.013 回答
0

是的,在 fireChannelRead() 执行期间,handler 会在子线程组中执行

于 2013-10-29T11:29:37.803 回答