43

Netty がどのようにスレッド プールを使用して動作するか説明していただけますか? ボスとワーカーの 2 種類のスレッドプールがあることを正しく理解していますか。Boss は I/O を行うために使用され、Worker はデータを処理するためにユーザー コールバック (messageReceived) を呼び出すために使用されますか?

4

2 に答える 2

35

これは NioServerSocketChannelFactory ドキュメントからのものです

サーバー側の NIO ベースの ServerSocketChannel を作成する ServerSocketChannelFactory 。NIO で導入されたノンブロッキング I/O モードを利用して、多数の同時接続を効率的に処理します。

スレッド
の仕組み NioServerSocketChannelFactory には 2 種類のスレッドがあります。1 つはボス スレッドで、もう 1 つはワーカー スレッドです。

ボス スレッド
バインドされた各 ServerSocketChannel には、独自のボス スレッドがあります。たとえば、80 と 443 などの 2 つのサーバー ポートを開いた場合、2 つのボス スレッドが作成されます。ボス スレッドは、ポートのバインドが解除されるまで着信接続を受け入れます。接続が正常に受け入れられると、ボス スレッドは受け入れられたチャネルを NioServerSocketChannelFactory が管理するワーカー スレッドの 1 つに渡します。

ワーカー スレッド
1 つの NioServerSocketChannelFactory は、1 つ以上のワーカー スレッドを持つことができます。ワーカー スレッドは、非ブロッキング モードで 1 つ以上のチャネルに対して非ブロッキングの読み取りと書き込みを実行します。

Nio モデルでは、bossThread がすべてのバインドされたソケット (リッスン ソケット) を処理し、workerThread が Accepted-socket を処理します (IO を含み、messageReceived などのイベント メソッドを呼び出します)。

于 2011-03-29T15:39:05.453 に答える
18

Netty Nio 実装 (3.2.4.Final) NioServerSocketChannelFactory に関する記述。

ワーカー スレッド プールは、少なくともワーカー スレッドの数 (現在のデフォルトでは 2*コア数) を配信できる必要があります。

なんで?

この実装の場合、各ワーカーには独自のセレクター ループがあります。これは、各ワーカーが 1 つのスレッドを「消費」してセレクターでスリープすることを意味します。また、そのワーカー (および関連付けられたスレッド) は、実際のすべての書き込みと読み取り (パイプラインでのイベントの起動を含む。つまり、ハンドラーがそのワーカー スレッドで実行されることを意味します) を実行する責任があります。

Bossスレッド プールの場合、現在の実装ではそこから 1 つのスレッドしか取得されないため、実際にはスレッド プールは不要です。そのスレッドは、接続がワーカーに登録されている接続を受け入れた後、ほとんどの場合、サーバーソケットのセレクターでスリープします。その瞬間から、ワーカーはその接続を提供する責任があります。

于 2011-05-17T14:22:00.280 に答える