Поток IOCP против пула потоков для обработки сообщений - PullRequest
1 голос
/ 18 марта 2012

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

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

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

Есть ли что-то, что вы можете поддерживать при обработке сообщений «Не в порядке» / «Параллельная обработка»?

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

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

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

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

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

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

0 голосов
/ 25 января 2019

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

...