0

Netty4 を使用して、複数のクライアント接続を提供する必要があるサーバーを作成しています。ServerBootstrap は、親スレッド グループとワーカー スレッド グループで構成されます。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());

ここで問題は、私のハンドラの次のメソッドが子エグゼキュータ グループで実行されるかどうかです。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 は子グループから 1 つのスレッド (別名、EventLoop) を配置して、チャネルとメッセージ転送などを処理します。ChannelPipeline に属するすべてのハンドラーは、このスレッドで実行されます。

于 2016-03-18T06:00:11.013 に答える
0

はい、ハンドラは fireChannelRead() の実行中に子スレッド グループで実行されます

于 2013-10-29T11:29:37.803 に答える