2013-02-20 41 views
1

我知道网状使用反应堆模式,以避免为每个连接创建线程, 这个模式的核心理念是“选择”,或在Linux中epoll系统调用。工作线程Netty中

但我也听说过,如果一个处理器从来没有关闭的通道,这将占用一个工作线程并阻止它:并不意味着每个引黄将使用(块)一个线程,所以每个接受的套接字我们仍然需要创建一个线程?

例如,如果我编写一个具有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); 
    } 
} 

回答

2

不,您的10,000个连接将共享工作线程。一个工作线程将处理多个连接/通道。这就是为什么不阻止工作线程非常重要的原因。

+0

但在我上面的例子中,服务器只能处理一个持久连接。 – Porcelain 2013-02-21 02:05:50

+0

我已经在Win7和Linux(CentOS 5)中使用netty-3.2.4.Final.jar尝试了这个例子。 – Porcelain 2013-02-21 02:06:51

+1

你有更多的工作者比线程。将工厂更改为1个工人,您会看到它可以处理多个连接。 – jdb 2013-02-21 02:30:30

1

1)在反应器图案,调度器通过监听事件队列的列表并传递该事件具体事件处理器获得一个事件。事件处理程序可以仅由一个线程,线程池或每个线程的每个事件执行。取决于你的实现。

2)您可以为每个通道添加超时定时器,并在输入数据上重置该定时器。如果定时器超时,则关闭此通道以防止太多空闲通道。

我的0.2美分?

+0

那么我的服务器如何可以通过一个线程同时提供两个连接?它似乎不工作,除非我关闭他们的一个频道。 – Porcelain 2013-02-20 02:56:23

+1

Netty框架应该支持非阻塞IO模式,通过线程池同时为多个连接提供服务。这里是描述这个功能的链接http://www.slideshare.net/zaubersoftware/non-blocking-io-with-netty – Houcheng 2013-02-20 04:47:50

+0

用中文,http://www.kafka0102.com/2010/06/167.html – Houcheng 2013-02-20 04:53:54