netty5 NioEventLoopGroup線程池簡析


 netty服務端ServerBootstrap 啟動的時候,默認有兩個eventloop分別是

 bossGroup和 workGroup. (其實大部分人這么叫的.並沒有明確這個名字).

一般服務端啟動的時候會使用下面的代碼

 1         NioEventLoopGroup bossGroup1 = new NioEventLoopGroup(1);//boss
 2         NioEventLoopGroup workerGroup = new NioEventLoopGroup();//worker
 3 
 4         try {
 5             ServerBootstrap b = new ServerBootstrap();
 6             ((ServerBootstrap)((ServerBootstrap)((ServerBootstrap)b.group(bossGroup1, workerGroup).channel(NioServerSocketChannel.class)).option(ChannelOption.SO_BACKLOG, Integer.valueOf(100))).handler(new LoggingHandler(LogLevel.INFO))).childHandler(new ChannelInitializer() {
 7                 public void initChannel(SocketChannel ch) throws Exception {
 8                     ChannelPipeline p = ch.pipeline();
 9                     if(sslCtx != null) {
10                         p.addLast(new ChannelHandler[]{sslCtx.newHandler(ch.alloc())});
11                     }
12 
13                     p.addLast(new ChannelHandler[]{new EchoServerHandler()});
14                 }
15             });
16             ChannelFuture f = b.bind(PORT).sync();
17             f.channel().closeFuture().sync();

 

其中boss用來監控tcp鏈接,worker用來處理io事件. 具體的說,boss執行 server.accept()操作 .worker處理事件的讀寫到業務邏輯處理等后續操作.
NioEventLoopGroup 和NioEventLoop 都可以.但是前者使用的是線程池. 其實bossgroup如果服務端開啟的是一個端口(大部分都是一個),單線程即可.
worker大部分情況需要多線程處理了 .因為 一個eventloop綁定了一個selector,事件都是通過selector輪詢處理的. 一萬個情況讓一個select處理和讓100個selector處理
肯定是多線程效率要高一些(因為有io).
那么下面就討論一下 ,eventloopgroup的默認線程個數.
請看下面代碼
//----開始調用---
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
//默認調用方法
    public NioEventLoopGroup() {
        this(0);
    }
//-----鏈1
  public NioEventLoopGroup(int nEventLoops, Executor executor) {
        this(nEventLoops, executor, SelectorProvider.provider());
    }
//------連2
 public NioEventLoopGroup(int nEventLoops, Executor executor, SelectorProvider selectorProvider) {
        super(nEventLoops, executor, new Object[]{selectorProvider});
    }
//連3------
 /**
     * @see {@link MultithreadEventExecutorGroup#MultithreadEventExecutorGroup(int, Executor, Object...)}
     */
    protected MultithreadEventLoopGroup(int nEventLoops, Executor executor, Object... args) {
        super(nEventLoops == 0 ? DEFAULT_EVENT_LOOP_THREADS : nEventLoops, executor, args);
    }
//---------連4
 private static final int DEFAULT_EVENT_LOOP_THREADS;

    static {
        DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
                "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2));

        if (logger.isDebugEnabled()) {
            logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS);
        }
    }

跟蹤一下就可以發現 

其實默認線程數是 cpu核心數的2倍. 但是也可以通過

-Dio.netty.eventLoopThreads  參數在服務端啟動的時候指定 .
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM