В большинстве примеров, которые я сейчас использую Netty, я вижу, что исполнитель босса - это кешированный поток. Из того, что я понимаю, цикл событий должен иметь только один поток, почему именно нам нужен кэшированный threadpool для цикла событий босса?Netty: Loop Event Event и исполнитель
ответ
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
это не совсем на самом деле ответить на мой вопрос. Какова цель cachedThreadpool для eventloop с одним потоком? –
Объяснение относится к Netty 4.x и выше. Если вы посмотрите на иерархию EventLoop, каждая реализация EventLoop расширяет SingleThreadEventLoop (кроме EmbeddedEventLoop, которая будет использоваться в основном для модульного тестирования). Если вы можете предоставить ссылку на примеры, которые вы видели, вам, вероятно, будет легче ответить на ваш вопрос. –
ссылка, которую вы публикуете, приведена в новейшей форме [ссылка] (https://github.com/netty/netty/blob/eb7f751ba519cbcab47d640cd18757f09d077b55/transport/src/main/java/io/netty/bootstrap/ServerBootstrap.java) –