Понимание использования Netty потоков - PullRequest
3 голосов
/ 04 января 2012

В netty события, которые проходят через конвейер канала, происходят по порядку, поскольку каждый канал фактически назначается только одному потоку, а каждый обработчик вызывает друг друга по очереди.Это имеет смысл и устраняет многие проблемы с синхронизацией.

Однако, если вы используете IdleStateHandler, из моего чтения источника получается, что событие channelIdle будет «обработано» в контексте потока Timers (потоканапример, использует HashedWheelTime).

Это случай или я что-то пропустил?Если это так, значит ли это, что возможно, чтобы событие idlestate и событие IO (например, messageRectained) выполнялись на одном и том же канале одновременно?

Кроме того, как я могсохранить ChannelHandler ctx и использовать его в другом потоке, например, для «записи» в канал, таким образом, также есть событие, идущее вниз по потоку в одном потоке и одновременно вверх по потоку в другом потоке на том же канале?

Наконец, какой поток выполняет ChannelFutures?

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

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Да, событие channelIdle и событие downstream / upstream могут быть запущены одновременно. Поэтому, если ваш обработчик реализует хотя бы два из трех, вам нужно добавить правильную синхронизацию. Я думаю, что мы должны сделать это более ясным в Javadocs ..

Теперь остальные вопросы ..

Вы можете вызывать Channel.write (...) из любого нужного вам потока. Так что можно просто сохранить его где-нибудь и вызывать write в любое время. Это также дает «ограничение», которое вам необходимо для правильной синхронизации «нисходящих» обработчиков.

ChannelFutures выполняются из рабочего потока.

1 голос
/ 04 января 2012

Однако, если вы используете IdleStateHandler, из моего чтения источника получается, что событие channelIdle будет «обработано» в контексте потока Timers (например, потока, который использует HashedWheelTime).

Это случай или я что-то пропустил? Если это так, означает ли это, что возможно, чтобы событие idlestate и событие IO (например, messageRectained) выполнялись на одном и том же канале в одно и то же время?

Да, вы упустили концепцию упорядоченного выполнения событий, доступную в Netty. Если у вас нет ExecutionHandler с OrderedMemoryAwareThreadPoolExecutor в конвейере, вы не можете иметь упорядоченное выполнение событий, особенно события состояния канала из IdleStateHandler.

Кроме того, поскольку я мог бы сохранить ChannelHandler ctx и использовать его в другом потоке, например, для «записи» в канал, таким образом, также было событие, идущее вниз по потоку в одном потоке и одновременно вверх по потоку в другом потоке на тот же канал?

Да, это правильно.

Более того, если вы хотите упорядочить выполнение события в нисходящем потоке, у вас есть обработчик выполнения нисходящего потока, подразумевающий OrderedMemoryAwareThreadPoolExecutor.

Наконец, в каком потоке выполняется ChannelFutures?

Выполнены потоками Oio / Nio Worker,

Но если ваш обработчик нисходящего потока потребляет какой-либо тип события и запускает событие другого типа ниже нисходящего потока, тогда ваш нисходящий обработчик может дополнительно обрабатывать будущее выполнение. это можно сделать, получив будущее событие downstream и вызвав

future.setSuccess()
...