を使用している場合でも、SocketChannels
処理にはスレッドプールを使用する必要がありますchannels
。
選択したもののポーリングselect()
と処理の両方を担当するスレッドを1つだけ使用するシナリオを考えると、1つのチャネルの処理に1秒かかり、キューに10のチャネルがある場合、次のポーリングまでに10秒待つ必要があります。耐えられないです。したがって、チャネル処理用のスレッドプールが必要です。SocketChannels
Selectors
この意味で、クライアントごとのスレッドブロッキングソケットパターンに大きな違いは見られません。主な違いはNIO
パターンにあり、タスクは小さく、タスクごとのスレッドに似ています。タスクの読み取り、書き込み、ビジネスプロセスなどの詳細については、Nettyの実装をNioServerSocketChannelFactory
確認できます。接続を受け入れる1つのBossスレッドを使用しており、処理のためにワーカースレッドのプールにタスクをディスパッチします
I / O操作は命令処理サイクルよりもかなり遅いことが多いため、1つのスレッドが本当に好きな場合は、少なくともI/Oスレッドをプールしている必要があります。貴重な1つのスレッドは必要ありません。 I / Oによってブロックされます。これは、1つのスレッド受け入れ接続を使用してNodeJSが実行していることとまったく同じであり、すべてのI / Oは非同期であり、バックエンドI/Oスレッドプールによって並列処理されます。
古いスタイルのクライアントごとのスレッドは死んでいますか?
そうは思いませんが、NIOプログラミングは複雑で、マルチスレッドは当然悪ではありません。最新のオペレーティングシステムとCPUはマルチタスクでますます良くなっているため、マルチスレッドのオーバーヘッドは時間の経過とともに小さくなります。