Хороший многопоточный веб-сервер python?
Я ищу веб-сервер python, который является многопоточным, а не мультипроцессом (как в случае mod_python для apache). Я хочу, чтобы он был многопоточным, потому что я хочу иметь кеш объектов памяти, который будет использоваться различными потоками HTTP. Мой веб-сервер делает много дорогостоящего материала и вычисляет некоторые большие массивы, которые необходимо кэшировать в памяти для использования в будущем, чтобы избежать перекомпоновки. Это невозможно в многопроцессорной среде веб-сервера. Хранение этой информации в memcache также не является хорошей идеей, поскольку массивы большие, и их хранение в memcache приведет к десериализации данных, поступающих из memcache, помимо дополнительных накладных расходов IPC.
Я реализовал простой веб-сервер с использованием BaseHttpServer, он дает хорошую производительность, но он застревает через несколько часов. Мне нужен еще более зрелый веб-сервер. Можно ли настроить apache для использования mod_python под моделью потока, чтобы я мог выполнить некоторое кэширование объектов?
Ответы
Ответ 1
CherryPy. Особенности, перечисленные на веб-сайте:
- Быстрый, HTTP/1.1-совместимый WSGI-потоковый веб-сервер. Как правило, сам CherryPy занимает всего 1-2 мс на страницу!
- Поддержка любого другого веб-сервера или адаптера с поддержкой WSGI, включая Apache, IIS, lighttpd, mod_python, FastCGI, SCGI и mod_wsgi
- Простота запуска нескольких HTTP-серверов (например, на нескольких портах) сразу
- Мощная система конфигурации для разработчиков и разработчиков, как
- Гибкая система плагинов
- Встроенные инструменты для кеширования, кодирования, сеансов, авторизации, статического контента и многих других.
- Встроенный адаптер mod_python
- Полный комплект тестов
- Сменные и настраиваемые... все.
- Встроенная поддержка профилирования, охвата и тестирования.
Ответ 2
Рассмотрите возможность пересмотра дизайна. Поддержание такого состояния на вашем веб-сервере, вероятно, является плохим. Многопроцессор - это гораздо лучший способ добиться стабильности.
Есть ли другой способ совместного использования состояния между отдельными процессами? Как насчет услуги? База данных? Индекс?
Кажется маловероятным, что поддержание огромного массива данных в памяти и использование одного многопоточного процесса для обслуживания всех ваших запросов - лучший дизайн или архитектура для вашего приложения.
Ответ 3
Twisted может служить таким веб-сервером. Хотя он и не является многопоточным, в текущем соединителе присутствует (еще не выпущенный) многопоточный контейнер WSGI. Вы можете проверить репозиторий SVN, а затем запустить:
twistd web --wsgi=your.wsgi.application
Ответ 4
Трудно дать окончательный ответ, не зная, на каком сайте вы работаете, и какую нагрузку вы ожидаете. Второе представление может быть серьезным требованием, или оно может и не быть. Если вам действительно нужно сохранить эту последнюю миллисекунду, вам абсолютно необходимо сохранить свои массивы в памяти. Однако, как утверждают другие, более чем вероятно, что вы не можете и могли бы получить что-то еще. Ваш шаблон использования данных в массиве может повлиять на ваши варианты выбора. Вероятно, вам не нужен доступ ко всему набору данных из массива сразу, чтобы вы могли разбить свои данные на более мелкие куски и поместить эти куски в кеш, а не один большой кусок. В зависимости от того, как часто ваши данные массива должны обновляться, вы можете сделать выбор между memcached, локальным db (berkley, sqlite, маленькой установкой mysql и т.д.) Или удаленным db. Я бы сказал, memcached для довольно частых обновлений. Локальный db для чего-то на частоте часового и дистанционного для частоты ежедневно. Следует учитывать и то, что происходит после промаха в кеше. Если 50 клиентов вдруг получат пропуски в кеше, и все они в то же время решают начать регенерировать эти дорогостоящие массивы, ваш ящик будет быстро уменьшен до 8086. Поэтому вы должны принять во внимание, как вы справитесь с этим. В многочисленных статьях рассказывается о том, как восстановить недостатки кэша. Надеюсь, что это будет полезно.
Ответ 5
Не многопоточно, но twisted может служить вашим потребностям.
Ответ 6
Возможно, у вас есть проблема с вашей реализацией в Python с помощью BaseHttpServer
. Там нет причин "застревать", и реализовать простой поточный сервер с помощью BaseHttpServer
и threading
не составит труда.
Также см. http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer о внедрении простого многопоточного сервера с HTTPServer
и ThreadingMixIn
Ответ 7
Вместо этого вы можете использовать распределенный кеш, доступный из каждого процесса, memcached, который появляется на ум.
Ответ 8
web.py сделал меня счастливым в прошлом. Рассмотрите возможность проверки.
Но похоже, что архитектурная редизайн может быть правильным, хотя и более дорогостоящим решением.
Ответ 9
Я использую CherryPy как лично, так и профессионально, и я очень доволен этим. Я даже делаю то, что вы описываете, например, глобальные кэши объектов, запуск других потоков в фоновом режиме и т.д. И он хорошо интегрируется с Apache; просто запустите CherryPy как автономный сервер, привязанный к localhost, а затем используйте Apache mod_proxy
и mod_rewrite
, чтобы Apache прозрачно перенаправлял ваши запросы на CherryPy.
Веб-сайт CherryPy http://cherrypy.org/
Ответ 10
В последнее время у меня была такая же проблема. А именно: мы написали простой сервер с использованием BaseHTTPServer и обнаружили, что тот факт, что он не является многопоточным, был большим недостатком.
Мое решение состояло в том, чтобы перенести сервер на Pylons (http://pylonshq.com/). Порт был довольно прост, и одним из преимуществ было очень легко создать графический интерфейс с использованием Pylons, чтобы я смог отобразить страницу состояния поверх того, что в основном является процессом демона.
Я бы обобщил Пилоны таким образом:
- он похож на Ruby on Rails, поскольку он очень легко развертывает веб-приложения.
- по умолчанию язык шаблонов, Мако, очень приятно работать с
- он использует систему маршрутизации URL-адресов, что очень удобно
- для нас производительность не является проблемой, поэтому я не могу гарантировать, что Pylons будет адекватно выполнять ваши потребности.
- вы можете использовать его с Apache и Lighthttpd, хотя я не пробовал это.
Мы также запускаем приложение с Twisted и довольны им. Twisted имеет хорошую производительность, но я считаю, что Twisted однопоточная/отложенная программа программирования довольно сложна. Он имеет множество преимуществ, но не был бы моим выбором для простого приложения.
Удачи.
Ответ 11
Просто чтобы указать что-то отличное от обычных подозреваемых...
Несколько лет назад, когда я использовал Zope 2.x Я читал о Medusa, поскольку это был веб-сервер, используемый для платформы. Они рекламировали его, чтобы он работал хорошо при большой нагрузке, и он может предоставить вам необходимую вам функциональность.