我知道netty使用Reactor模式来避免为每个连接创建一个线程,
关于这种模式的核心概念是Linux中的“选择器”或epoll
系统调用。
但是我也听说过如果一个处理程序从不关闭它的通道,它将占用一个工作线程并阻塞它:这并不意味着每个连接将使用(阻塞)一个线程,所以每个接受的套接字我们还需要创建一个帖子吗?
例如,如果我编写一个具有10,000个持久连接的服务器,该服务器是否需要10,000个工作线程?上述两件事之间的矛盾使我感到困惑,如果我理解错误,任何人都能解释我吗?谢谢〜
========================================
一个示例(只有一个工作线程),它可以始终同时处理一个客户端的事件。
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);
}
}
答案 0 :(得分:3)
不,您的10,000个连接将共享工作线程。一个工作线程将处理多个连接/通道。这就是为什么不阻止工作线程非常重要的原因。
答案 1 :(得分:1)
1)在reactor模式中,调度程序通过侦听事件队列列表并将事件传递给具体事件处理程序来获取一个事件。事件处理程序只能由一个线程,线程池或每个线程的每个事件执行。取决于你的实施。
2)您可以为每个通道添加超时计时器,并在传入数据上重置此计时器。如果定时器超时,则关闭此通道以防止过多的空闲通道。
我的0.2美分?