2015-02-23 5 views
1

В большинстве примеров, которые я сейчас использую Netty, я вижу, что исполнитель босса - это кешированный поток. Из того, что я понимаю, цикл событий должен иметь только один поток, почему именно нам нужен кэшированный threadpool для цикла событий босса?Netty: Loop Event Event и исполнитель

ответ

5

Netty имеет концепцию EventLoopGroup, которая объединяет несколько EventLoop s. EventLoop однопоточный, EventLoopGroup в основном нет. Если вы не делаете старый блокирующий ввод-вывод.

Теперь, что касается босса и рабочих. Предполагая, что вы говорите о реализации сервера, босс теперь называется parentGroup и рабочими childGroup. Родитель обрабатывает ввод-вывод для акцепторного канала, то есть тот, который ограничен портом, на котором ваш сервер принимает новые запросы. Дети будут обрабатывать ввод-вывод для принятых соединений. В самом деле, канал акцептора должен обрабатываться одной и только нитью, и это будет. Если вы передадите EventLoopGroup с несколькими EventLoop s родительскому, в любом случае он будет использовать только один из EventLoop s, поэтому рекомендуется использовать один и тот же EventLoopGroup как для родителя, так и для ребенка.

ServerBootstrap фактически предоставляет два конструктора, один, который принимает одну группу и использует ее для обоих родителей и клиента:

@Override 
public ServerBootstrap group(EventLoopGroup group) { 
    return group(group, group); 
} 

и тот, который позволяет явно передать один для родителей и один для ребенок:

public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) { 
    super.group(parentGroup); 
    if (childGroup == null) { 
     throw new NullPointerException("childGroup"); 
    } 
    if (this.childGroup != null) { 
     throw new IllegalStateException("childGroup set already"); 
    } 
    this.childGroup = childGroup; 
    return this; 
} 

Вы можете проверить его здесь: https://github.com/netty/netty/blob/master/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java

+0

это не совсем на самом деле ответить на мой вопрос. Какова цель cachedThreadpool для eventloop с одним потоком? –

+0

Объяснение относится к Netty 4.x и выше. Если вы посмотрите на иерархию EventLoop, каждая реализация EventLoop расширяет SingleThreadEventLoop (кроме EmbeddedEventLoop, которая будет использоваться в основном для модульного тестирования). Если вы можете предоставить ссылку на примеры, которые вы видели, вам, вероятно, будет легче ответить на ваш вопрос. –

+0

ссылка, которую вы публикуете, приведена в новейшей форме [ссылка] (https://github.com/netty/netty/blob/eb7f751ba519cbcab47d640cd18757f09d077b55/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java) –