2016-11-28 2 views
0

Я создаю распределенную систему с множеством машин для обучения. Мне нужно отправить и получить данные между машинами, и я использую java.nio для создания этой сети. В одной машине я использую один поток для serverocketchannel для приема данных с других компьютеров и для каждого пакета данных я создаю новый поток для его отправки. Это означает, что один поток для приема и несколько потоков для отправки на одной машине.Сколько потоков следует использовать для отправки и получения данных с помощью java.nio?

Но я столкнулся с проблемой, так как один поток обрабатывает прием, многие клиенты будут отложены при подключении. Должен ли я изменить его на один поток, обрабатывающий получение, и один поток обрабатывает отправку? Спасибо P/s: Я не хочу использовать сторонние рамки.

ответ

0

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


Я не могу судить о том, что вы «должны делать», поскольку я не знаю, чего вы пытаетесь выполнить.

Во всяком случае, две общие модели, используемые на стороне приемника являются:

  • Один поток обрабатывает все
  • Один поток обрабатывает только принимать соединения и открытия потока, затем делегирует фактическая работа с потоком к другому потоку (обычно из пула потоков, чтобы предотвратить исчерпание ресурсов, которое могло бы произойти, если новый поток был создан для каждого соединения)
+0

Это мое дело. У меня 4 машины. В некоторых случаях машина №1 должна получать 10000 байт от остальных трех. Вы имеете в виду, что в машине № 1 я могу использовать 2 потока, 1-й поток может принимать соединение и открывать поток, а затем передавать в другой поток для приема байтов, а затем 1-й поток возвращается для повторного прослушивания новых входящих соединений. Это то, что вы имели ввиду? – hminle

+0

Да, это общий подход. Обычно вы не знаете, сколько отправителей там будет (например, с веб-сервером). Вам все равно потребуется столько «рабочих» потоков на сервере, поскольку в сети есть потоки отправителей (плюс один поток, который просто принимает подключения и делегирует работу рабочим) для всех отправителей, которые будут обслуживаться одновременно. –

+0

но я использую java nio, как вы можете отделить две части в java nio? вот как я реализую свой серверный поток https://gist.github.com/hminle/0e4a18ad5b3b37ee57348e673c5262fd – hminle

Смежные вопросы