2012-01-10 3 views
3

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

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

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

Он говорит: «Для создания асинхронных обработчиков, используйте классы ThreadingMixIn и ForkingMixIn.»

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

ответ

3

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

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

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

+0

Отлично. Некоторые исследования. Какую технологию вы бы использовали, если бы вы были в такой ситуации? Мне нужно перенести этот Nginx PHP на что-то другое. Некоторое постоянное приложение, в котором встроен HTTP-сервер. –

+0

Торнадо в автономном приложении Py или с Nginx? Этот тест показывает, что Nginx + Tornado достигла 8000+ в секунду. http://en.wikipedia.org/wiki/Tornado_%28web_server%29 –

+0

@Don Question: ThreadingMixin использует threading.thread, который является AFAIK потоком уровня os, и в этом случае он не имеет отношения к GIL. Это сделало бы threadingmixin идеальным выбором для OP. –

Смежные вопросы