2017-12-13 2 views
0

Ich lese the article über Thread-Modell in Netty und habe eine Frage über IO in Netty. Betrachten Sie die folgende ServerBootstrap Erklärung:Was sind E/A-Threads in Netty?

NioEventLoopGroup workerGroup = new NioEventLoopGroup(16) 
new ServerBootstrap() 
.childHandler(
    new ChannelInitializer<Channel> { 
      override def initChannel(ch: Channel) = ch.pipeline() 
      .addLast(new ChannelDuplexHandler) // Without specifying event-loop-group 
      .addLast(workerGroup, new HttpRequestDecoder()) //event group specified 
    } 

Soweit ich das ChannelDuplexHandler verstanden wird von IO-Threads direkt aufgerufen werden.

Die Frage ist, wie kann ich die IO-Threads konfigurieren (ändern Sie die Anzahl der IO-Threads, möglicherweise überschreiben den IO-Thread, um meine benutzerdefinierte Interrupt-Verhalten zu definieren)?

Kann ich meine Event-Loop-Gruppe zu einer IO-Gruppe machen? Ich meine

NioEventLoopGroup myIoGroup = new NioEventLoopGroup(16); 
           // Is it possible to make it IO-group? 

Antwort

0

ich ein bisschen von Ihrer Frage verwirrt bin so hoffe ich, diese Antworten es .... Die Fäden, die von der EventLoopGroup verwendet werden, sind „IO-Threads“ und die Nummer, die Sie in geben sind die Zahlen von "IO-Threads", die Sie verwenden möchten. Jeder dieser Threads behandelt 0-n-Kanäle. Um die Anzahl der IO-Threads zu erhöhen, geben Sie hier eine andere Zahl als "16" an.

Pro Kanal wird nur ein "IO-Thread" verwendet. Wenn Sie sicherstellen möchten, dass ein ChannelHandler aus dem IO-Thread ausgelagert wird, erstellen Sie normalerweise einen DefaultEventExecutorGroup und geben diesen beim Hinzufügen des ChannelHandler an. Der EventExecutorGroup sollte zwischen verschiedenen Channel Instanzen geteilt werden, um Threads optimal zu nutzen.

Etwas wie folgt aus:

NioEventLoopGroup workerGroup = new NioEventLoopGroup(16)   
EventExecutorGroup executorGroup = new DefaultEventExecutorGroup(numberOfThreads); 
new ServerBootstrap() 
    .childHandler(
     new ChannelInitializer<Channel> { 
      override def initChannel(ch: Channel) = ch.pipeline() 
       .addLast(new ChannelDuplexHandler) // Without specifying event-loop-group 
       .addLast(executorGroup, new HttpRequestDecoder()) 
}