1

netty が Reactor パターンを使用して、接続ごとにスレッドを作成することを回避していることは知っています。このパターンに関する中心的な概念は、Linux の「セレクター」またはepollシステム コールです。

しかし、ハンドラーがチャネルを閉じない場合、1 つのワーカー スレッドを占有してブロックするということも聞きました。それは、各接続が 1 つのスレッドを使用 (ブロック) するという意味ではないので、受け入れられたソケットごとに、まだ作成する必要があります。スレッド ?

たとえば、10,000 の永続的な接続を持つサーバーを作成した場合、このサーバーには 10,000 のワーカー スレッドが必要ですか??

上記の 2 つの矛盾に私は混乱しました。私の理解が間違っていたら、誰か説明してもらえますか? ありがとう〜

========================================

常に 1 つのクライアントのイベントを同時に処理できる例 (1 つのワーカー スレッドのみ)。

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.*;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
public class Netty_test {
    public static void main(String[] args) {
        ChannelFactory factory =new     NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newFixedThreadPool(1));
    ServerBootstrap bootstrap = new ServerBootstrap(factory);
        ChannelPipelineFactory cpf=new ChannelPipelineFactory(){
            public ChannelPipeline getPipeline() {
                return Channels.pipeline(new testHandler());
            }
        };
        bootstrap.setPipelineFactory(cpf);
        bootstrap.setOption("child.tcpNoDelay", true);      
        bootstrap.bind(new InetSocketAddress(100));
    }
}
class testHandler extends SimpleChannelHandler {
@Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {    
        System.out.println("messageReceived, handler work.");
        e.getChannel().write(e.getMessage());
        ctx.sendUpstream(e);
    }
}
4

2 に答える 2

3

いいえ、10,000の接続はワーカースレッドを共有します。1つのワーカースレッドが複数の接続/チャネルを処理します。これが、ワーカースレッドをブロックしないことが非常に重要である理由です。

于 2013-02-20T09:39:49.917 に答える
1

1) リアクター パターンでは、ディスパッチャーはイベント キューのリストをリッスンし、そのイベントを具体的なイベント ハンドラーに渡すことで 1 つのイベントを取得します。イベント ハンドラーは、1 つのスレッド、スレッド プール、またはスレッドごとのイベントごとにのみ実行できます。実装によって異なります。

2) チャネルごとにタイムアウト タイマーを追加し、着信データでこのタイマーをリセットできます。タイマーがタイムアウトした場合は、このチャネルを閉じて、アイドル状態のチャネルが多くなりすぎないようにします。

私の0.2セント?

于 2013-02-20T01:52:01.693 に答える