Неблокирующая Socket Polling vs Blocking socket - PullRequest
3 голосов
/ 04 июня 2009

Мне нужно отправить и recv одновременно.
Какой вариант будет лучше:

  • 1 обработка потока отправка и получение с неблокирующим сокетом

или

  • 2 потока с одной блокировкой обработки recv () + одна обработка send ()?

Или есть другое решение?

Я ожидаю иметь до 50 двусторонних соединений. В результате получается 50 потоков в варианте № 1 и 100 потоков в варианте № 2.

Ответы [ 4 ]

3 голосов
/ 04 июня 2009

Я бы не использовал ни один из этих подходов.

Взгляните на этот ТАК вопрос. Я бы использовал модель рабочих потоков, где у вас будет N потоков, обрабатывающих весь трафик с неблокирующими сокетами.

Если вы абсолютно ДОЛЖНЫ следовать одному из только что описанных подходов, используйте неблокирующее ИМХО.

2 голосов
/ 04 июня 2009

Вы должны использовать неблокирующие сокеты, но вместо того, чтобы опрашивать их вручную, ядро ​​должно сделать это за вас. Для этого используйте poll или select (предпочтительнее первое, поскольку оно может обрабатывать больше сокетов одновременно). Когда вы сделаете это, вы получите 1 поток в варианте 1 или 2 потока в варианте 2.: -P

0 голосов
/ 05 июня 2009

Если вас беспокоит производительность и масштабируемость, попробуйте IOCP (асинхронное чтение / запись сокетов): Как написать масштабируемый сервер на основе Tcp / Ip

Обратите внимание, что реализовать IOCP намного сложнее, чем «поток на соединение», и, поскольку у вас будет только 50 соединений (или 100 потоков, как вы предлагаете), это может быть «достаточно хорошо» и проще для осуществить правильно.

Попробуйте простой подход и измерьте его ... но если вы либо: нуждаетесь в большей производительности, либо собираетесь масштабировать (далеко?) За пределы 50 соединений, серьезно рассматривайте IOCP как лучшее решение.

0 голосов
/ 04 июня 2009

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

Тогда вам не нужно опрашивать, потому что select () блокирует без использования процессорного времени.

...