Как Netty использует пулы потоков? - PullRequest
33 голосов
/ 29 марта 2011

Не могли бы вы объяснить, как Netty использует пулы потоков для работы? Правильно ли я понимаю, что существует два вида потоковых пулов: начальник и рабочий. Босс используется для ввода / вывода, а рабочий - для вызова пользовательских обратных вызовов (messageReceived) для обработки данных?

Ответы [ 2 ]

30 голосов
/ 29 марта 2011

Это из документа NioServerSocketChannelFactory

ServerSocketChannelFactory, который создает на сервере NIO на основе ServerSocketChannel. Он использует неблокирующий режим ввода / вывода, который был познакомился с NIO, чтобы служить многим количество одновременных подключений эффективно.

Как работают темы
Есть два типа нитей в NioServerSocketChannelFactory; один начальник нить, а другой рабочий нить.

Босс темы
Каждый связан У ServerSocketChannel есть свой начальник нить. Например, если вы открыли два порты сервера, такие как 80 и 443, вы будет иметь две темы босса. Начальник поток принимает входящие соединения пока порт не связан. Когда соединение успешно принято, босс нить проходит принятый Канал к одному из рабочих потоков что NioServerSocketChannelFactory управляет.

Рабочие темы
Один NioServerSocketChannelFactory может иметь один или несколько рабочих потоков. Рабочий поток выполняет неблокирующее чтение и написать для одного или нескольких каналов в неблокирующий режим.

В модели Nio, bossThread заботится обо всех ограниченных сокетах (слушающий сокет), workerThread заботится о Accepted-сокете (включая IO и метод события вызова, такой как messageReceived).

15 голосов
/ 17 мая 2011

Описание, относящееся к реализации Netty Nio (3.2.4.Final) NioServerSocketChannelFactory.

Пул рабочих потоков должен иметь возможность доставлять как минимум число потоков Workers (в настоящее время по умолчанию 2* количество ядер).

Почему?

В случае этой реализации у каждого работника есть свой собственный цикл выбора, это означает, что каждый работник "съест" один поток, чтобы заснуть на селекторе,Кроме того, этот работник (и связанный с ним поток) отвечает за выполнение всех фактических операций записи и чтения (включая инициирование событий в конвейере, что означает, что обработчики выполняются в этом рабочем потоке).

В случаеНачальный пул потоков, фактически пул потоков не нужен, потому что текущая реализация получает от него только один поток.Этот поток спит на селекторе для сокета сервера большую часть времени, после принятия соединения это соединение регистрируется рабочим.С этого момента работник несет ответственность за обслуживание этого соединения.

...