Я недавно читал этот документ , в котором перечислен ряд стратегий, которые можно использовать для реализации сокет-сервера. А именно:
- Обслужите много клиентов с каждым потоком и используйте неблокирующий ввод-вывод и уведомление о готовности, инициируемое уровнем
- Обслужите много клиентов с каждым потоком и используйте неблокирующий ввод-вывод и уведомление об изменении готовности
- Обслужите много клиентов с каждым серверным потоком и используйте асинхронный ввод / вывод
- обслуживает одного клиента с каждым потоком сервера и использует блокирующий ввод / вывод
- Сборка кода сервера в ядре
Теперь я был бы признателен за подсказку, по которой следует использовать в CPython , которая, как мы знаем, имеет некоторые хорошие и некоторые плохие моменты. В основном меня интересует производительность в условиях высокого параллелизма, и да, ряд текущих реализаций слишком медленный.
Так что, если я могу начать с простого, "5" отсутствует, поскольку я не собираюсь взламывать что-либо в ядре.
"4" Также похоже, что это должно быть из-за GIL. Конечно, вы могли бы использовать многопроцессорность вместо потоков, и это дает значительный импульс. Преимущество блокирования ввода / вывода заключается в том, что его легче понять.
И здесь мои знания немного уменьшаются:
«1» - это традиционный выбор или опрос, который можно легко объединить с многопроцессорной обработкой.
«2» - это уведомление о готовности к смене, используемое более новыми системами epoll и kqueue
"3" Я не уверен, что есть какие-либо реализации ядра для этого, которые имеют оболочки Python.
Итак, в Python у нас есть набор отличных инструментов, таких как Twisted. Возможно, это лучший подход, хотя я проверил Twisted и нашел его слишком медленным на многопроцессорной машине. Возможно, 4 витка с балансировщиком нагрузки могут сделать это, я не знаю. Любой совет будет оценен.