Сколько и в течение какого времени я могу читать с каналов после возврата селектора? - PullRequest
2 голосов
/ 03 апреля 2012

Допустим, у меня есть несколько каналов UDP и некоторые каналы TCP, зарегистрированные с помощью моего селектора. Как только селектор активируется, могу ли я просто продолжать цикл и читать как можно больше информации со ВСЕХ клавиш (не только выбранных) без повторения цикла и выполнения другого выбора ()? Для TCP это не имеет особого смысла, так как я могу читать как можно больше в свой ByteBuffer с вызовом channel.read (), но для UDP вы можете читать только один пакет за раз с вызовом channel.receive () , Так сколько пакетов я читаю? Вы видите проблему с тем, чтобы просто продолжать читать (не просто читать, а писать, подключать и принимать, другими словами, ВСЕ ключевые операции), пока не останется ничего другого, после чего я снова выполню выбор? Таким образом, канал UDP не будет голодать по другим каналам. Вы обработаете все каналы столько, сколько сможете, считывая по одному пакету за раз из каналов UDP. Я особенно обеспокоен:

1) Удар по производительности при выполнении слишком большого количества операций выбора, если я могу просто продолжать обрабатывать свои ключи без него.

2) Делает ли select () что-то фундаментальное, что я не могу обойти, чтобы продолжить чтение / запись / принятие / подключение?

Опять же, помните, что я буду обрабатывать все ключи, а не только выбранные. Если для ключа ничего не нужно делать (без данных), я просто ничего не делаю и перехожу к следующему ключу.

1 Ответ

3 голосов
/ 03 апреля 2012

Я думаю, вы должны попробовать это обоими способами. Вы можете создать правдоподобный аргумент, который говорит, что вы должны читать каждый читаемый канал, пока read () не вернет ноль, или что вы должны обрабатывать одно событие на канал и делать только одно чтение каждый раз. Я, вероятно, предпочитаю первое, но я помню, когда я этого не сделал.

Опять же, помните, что я буду обрабатывать все ключи, а не только выбранные.

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

...