Python ThreadingMixin и BaseHTTPServer - PullRequest
3 голосов
/ 10 января 2012

Я пытаюсь оценить различные языки для создания небольшого по размеру сервера приложений с высокой пропускной способностью.Он должен выполнять небольшие операции, такие как получение запроса, чтение данных с отдельного сервера, на котором запущено приложение кеша (memcached, redis), и отправка 5-10-строчного XML или JSON.Очень высокая пропускная способность ~ 1000 в секунду при производстве по крайней мере.У меня это есть на Nginx - PHP и memcached занимает 5+ мс, чтобы отправить все необходимые данные, поэтому есть какой-то сетевой ввод-вывод, который блокирует.

Я смотрел на класс Python BaseHTTPServer.Я не гуру питона, но мне нужно знать, как это работает за кулисами.Если вы читаете эту страницу -

http://docs.python.org/library/socketserver.html

Там написано «Чтобы создать асинхронные обработчики, используйте классы ThreadingMixIn и ForkingMixIn».

Является ли это действительно асинхронным или делает этоначать один поток на клиента.Если это в одном потоке для каждой клиентской модели - это потоки уровня ОС?Если я придерживаюсь одного потока для каждой клиентской модели, достаточно ли быстро очистит GC Python, если я дам ему высокую оперативную память, 8-ядерный экземпляр amazon.

1 Ответ

3 голосов
/ 10 января 2012

ForkingMixIn , как вы можете видеть в исходном коде, делает настоящий форк. ThreadingMixIn использует потоки Python.Таким образом, вам приходится иметь дело с GIL, что означает, что даже если он использует базовый механизм os-threading, не будет параллельной обработки ваших python-потоков.Я бы не рекомендовал его для высокопроизводительного сервера.

Короче говоря: NO , они не являются асинхронными согласно вашему определению.Если вам нужна «настоящая» асинхронная (одноядерная / процессная / потоковая) функциональность, вам следует изучить: Twisted или Tornado или, возможно, Gunicorn .Позднее, вероятно, не будет соответствовать вашему определению асинхронного.

Я бы предложил использовать torndado с nginx.В группах google есть пост о том, как его настроить.Поскольку на внутреннем Tornado-Server реализованы не все стандарты, вы можете использовать «настоящий» сервер в качестве прокси.

...