20

スレッドがどのように処理されるかを調べるために、Netty 4.0.0.Alpha5 コードを調べています。また、 http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-h2-34にある Netty 4 の新しいスレッド モデルの紹介も読みました。

私が理解しているように、目標は次のとおりです。

  • スレッド アフィニティ、チャネルを単一のスレッド (EventLoop) に貼り付けます。このアプローチは、キャ​​ッシュ ミスを減らし、NUMA ハードウェアの状況を改善するために採用されたものだと思います。

それで、私の解釈が正しいかどうか疑問に思っています。もし私が正しければ、次の疑問が生じます。

  • ChannelPipeline に長時間実行されている可能性のある ChannelHandler (データベース操作など) があると、EventLoop (スレッド) がブロックされる可能性があるため、同じ EventLoop (スレッド) に割り当てられた他のすべてのチャネルがブロックされます。この解釈は本当ですか?
  • その問題を回避しようとして、長時間実行されている ChannelHandler に EventExecutor を使用できますが、ドキュメント (上記のリンクを参照) によると、チャネルは EventExecutor 内の単一のスレッドに再びスタックしているため、同じ割り当てられている他のチャネルを再びブロックする可能性があります。スレッド (EventExecutor 内)。私は何かを見逃しましたか、それともこれは本当ですか?

私は、物事がそのようになっている理由を理解し、Netty 4 の設計意図に関する情報を得ようとしています。

4

2 に答える 2

8

両方の質問に当てはまります。I/O 以外のイベント グループにハンドラーを割り当てることで、データベース アクセスなどの長時間実行される操作によって I/O スレッドがブロックされるのを防ぐことができます。EventExecutorGroupハンドラーの動作に応じて、大きなサイズの を指定できます。通常のスレッド プールと大差ありません。スレッド プールがビジー状態の場合、実行時間の長いタスクを実行しようとするとキューに入れられます。

于 2012-10-18T16:27:42.660 に答える