Я недавно читал this document, в котором перечислены некоторые стратегии, которые могут быть использованы для реализации сервера сокетов. А именно, они:Написание сервера на основе сокетов в Python, рекомендуемые стратегии?
- Подавать много клиентов с каждым потоком, и использовать неблокирующий I/O и уровень срабатывает уведомление о готовности
- Подавать много клиентов с каждым потоком, и использовать неблокирующий I/O и готовность уведомлений об изменениях
- обслуживать множество клиентов с каждым сервером потока, и использовать асинхронный ввод/вывод
- обслуживать один клиент с каждым сервером потока, и использовать блокирование ввода/вывода
- построить код сервера в ядро
Теперь, я был бы признателен за подсказку, по которой следует использовать в CPython, который, как мы знаем, имеет хорошие моменты и некоторые плохие моменты. Меня больше всего интересует производительность при высоком параллелизме, и да, ряд текущих реализаций слишком медленный.
Так что, если я могу начать с простого, «5» отсутствует, так как я не собираюсь что-то взламывать в ядро.
«4» Также похоже, что он должен быть из-за GIL. Конечно, вы можете использовать многопроцессорную обработку вместо потоков здесь, и это значительно повышает уровень. Преимущество блокировки ввода-вывода состоит в том, что его легче понять.
И здесь мои знания убывание немного:
«1» традиционный выбор или опрос, который может быть тривиальным в сочетании с многопроцессорной.
«2» является уведомлением готовности смены, используемый новой Epoll и Kqueue
«3» Я не уверен, что есть какая-либо реализация ядра для этого, которые имеют обёртки Python.
Итак, у Python у нас есть сумка с большими инструментами, такими как Twisted. Возможно, это лучший подход, хотя я тестировал Twisted и нашел его слишком медленным на многопроцессорной машине. Возможно, это может быть 4 поворота с балансировкой нагрузки, я не знаю. Любой совет будет принят во внимание.
Я думаю, что epoll находится в stdlib в версии 2.6+ и easy_installable для 2.5. Пакет называется select-something. Извините за неопределенность. –
Twisted может также использовать epoll. Фактически, Twisted превращает все поддерживаемые API уведомлений о событиях в единый API, который он представляет вам. Поэтому, если лучше всего подходит платформа, выберите, ваше приложение использует select. Если у вас есть epoll, ваше приложение использует epoll. Все прозрачно для вас. –
Это написано 'asyncore' – new123456