Поток IOCP против пула потоков для обработки сообщений

Когда вы работаете с сокетом IO, используя BeginReceive/EndReceive, обратный вызов вызывается потоком IOCP.

Как только вы закончите получать вам нужно обработать данные.

  • Должны ли вы сделать это в вызывающем потоке обратного вызова?
  • Или вы должны запустить задачу, используя ThreadPool.QueueUserWorkItem

Обычно сэмплы выполняют работу в потоке обратного вызова, что немного сбивает с толку.

Если вы имеете дело с несколькими сотнями активных соединений, выполнение обработки в потоке IOCP заканчивается процессом с сотнями потоков. Поможет ли ThreadPool ограничение количества одновременных потоков?

1 ответ

Я не знаю, что существует общий "правильный ответ" для всех - это будет зависеть от вашего индивидуального варианта использования.

Вот некоторые вещи, которые следует учитывать, если вы решите пойти по пути ThreadPool.

Вы можете поддерживать обработку сообщений вне очереди / одновременно?

Если Socket A получает сообщения 1, 2 и 3 в быстрой последовательности - они могут в конечном итоге обрабатываться одновременно или не в порядке.

.NET имеет пулы потоков для каждого ЦП, если один ЦП не работает, он может "красть" задачи у других ЦП. Это может означать, что ваши сообщения могут быть выполнены в произвольном порядке.

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

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

Вам нужно беспокоиться о возможном отказе в обслуживании?

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

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

Другие вопросы по тегам