- Каковы недостатки этой модели при проектировании серверной/распределенной системы?
Если ваш язык реализации устанавливает минимальное значение размера стека, выделенного потоку, то у вас заканчивается память, если у вас большое количество подключений. Кроме того, создание множества недолговечных потоков имеет свою стоимость.
У вас также могут возникнуть проблемы с производительностью или надежностью, когда многие потоки пытаются получить доступ к общим данным, или если ваша ОС не интегрирует сетевые события для пробуждения потока.
- Какой подход будет работать лучше в большинстве случаев?
В большинстве случаев это работает нормально - в большинстве систем достаточно памяти для ~ 10 000 одновременных клиентов (или ~ 1000 в Windows, если вы не удосужились установить размер стека для потоков и оставить его равным 1 МБ).
Вместо этого можно использовать асинхронные библиотеки, управляемые событиями, которые позволяют пулу из N потоков обрабатывать M соединений. Простое использование пула потоков для создания потока снижает затраты на их создание, но ничего не делает для предотвращения нехватки памяти для большого количества клиентов.
- В каких случаях это может быть правильным подходом?
Это почти никогда не является технически «наилучшим» подходом, но иногда имеет прагматический инженерный смысл.
Исторически языки не предоставляли простых библиотек для создания пулов потоков или использования асинхронных сокетов. Если вы используете такой язык и не ожидаете большого количества соединений, а соединения, как правило, остаются на связи в течение более длительного времени, то не стоит вкладывать ресурсы разработчика в технически лучшее решение.
person
Pete Kirkham
schedule
25.08.2016