Хороший многопоточный веб-сервер на Python? - PullRequest
13 голосов
/ 17 октября 2008

Я ищу веб-сервер Python, который является многопоточным, а не многопроцессорным (как в случае mod_python для Apache). Я хочу, чтобы он был многопоточным, потому что я хочу иметь кэш объектов в памяти, который будет использоваться различными http-потоками. Мой веб-сервер делает много дорогих вещей и вычисляет несколько больших массивов, которые необходимо кэшировать в памяти для будущего использования, чтобы избежать повторного вычисления. Это невозможно в многопроцессорной среде веб-сервера. Хранение этой информации в memcache также не очень хорошая идея, так как массивы большие, и хранение их в memcache приведет к десериализации данных, поступающих из memcache, помимо дополнительных издержек IPC.

Я реализовал простой веб-сервер с использованием BaseHttpServer, он дает хорошую производительность, но застревает через несколько часов. Мне нужен более зрелый веб-сервер. Можно ли настроить apache для использования mod_python в потоковой модели, чтобы я мог выполнять кэширование некоторых объектов?

Ответы [ 11 ]

16 голосов
/ 17 октября 2008

CherryPy . Особенности, перечисленные на сайте:

  • Быстрый, HTTP / 1.1-совместимый, WSGI веб-сервер с пулами потоков. Как правило, сам CherryPy занимает всего 1-2 мс на страницу!
  • Поддержка любого другого веб-сервера или адаптера с поддержкой WSGI, включая Apache, IIS, lighttpd, mod_python, FastCGI, SCGI и mod_wsgi
  • Простота запуска нескольких HTTP-серверов (например, на нескольких портах) одновременно
  • Мощная система конфигурации для разработчиков и развертывателей
  • Гибкая система плагинов
  • Встроенные инструменты для кэширования, кодирования, сеансов, авторизации, статического содержимого и многого другого
  • Собственный адаптер mod_python
  • Полный набор тестов
  • Сменный и настраиваемый ... все.
  • Встроенная поддержка профилирования, покрытия и тестирования.
7 голосов
/ 17 октября 2008

Подумайте о пересмотре вашего дизайна. Поддержание такого состояния в вашем веб-сервере, вероятно, плохая идея. Многопроцессорность - гораздо лучший способ добиться стабильности.

Есть ли другой способ поделиться состоянием между отдельными процессами? Как насчет услуги? База данных? Индекс?

Маловероятно, что поддержание огромного массива данных в памяти и использование единого многопоточного процесса для обслуживания всех ваших запросов - лучший дизайн или архитектура для вашего приложения.

6 голосов
/ 18 октября 2008

Twisted может служить таким веб-сервером. Несмотря на то, что он не является многопоточным, в текущей магистрали присутствует (еще не выпущенный) многопоточный контейнер WSGI. Вы можете проверить репозиторий SVN и затем запустить:

twistd web --wsgi=your.wsgi.application
3 голосов
/ 18 октября 2008

Трудно дать однозначный ответ, не зная, над каким сайтом вы работаете и какую нагрузку вы ожидаете. Производительность до секунды может быть серьезным требованием, а может и нет. Если вам действительно нужно сохранить эту последнюю миллисекунду, тогда вам абсолютно необходимо сохранить свои массивы в памяти. Однако, как и предполагали другие, более чем вероятно, что вы этого не сделаете и могли бы обойтись чем-то другим. Ваша схема использования данных в массиве может повлиять на выбор, который вы делаете. Вам, вероятно, не нужен доступ ко всему набору данных из массива одновременно, чтобы вы могли разбить данные на более мелкие куски и поместить эти куски в кеш вместо одного большого куска. В зависимости от того, как часто необходимо обновлять данные вашего массива, вы можете выбрать между memcached, локальным db (berkley, sqlite, небольшой установкой mysql и т. Д.) Или удаленным db. Я бы сказал, memcached для довольно частых обновлений. Локальная база данных для чего-то с частотой почасовая и удаленная с частотой ежедневная. Также следует учитывать, что происходит после пропуска кэша. Если 50 клиентов внезапно получат пропуск кеша, и все они одновременно решат начать восстановление этих дорогих массивов, ваши ящики будут быстро уменьшены до 8086. Таким образом, вы должны принять во внимание, как вы будете справляться с этим. Во многих статьях рассказывается о том, как восстановить ошибки кэша. Надеюсь, что это полезно.

2 голосов
/ 18 октября 2008

web.py сделал меня счастливым в прошлом. Попробуйте проверить это.

Но звучит так, будто архитектурный редизайн может быть правильным, хотя и более дорогим решением.

2 голосов
/ 17 октября 2008

Вместо этого вы можете использовать распределенный кеш, доступный из каждого процесса, memcached - пример, который приходит на ум.

2 голосов
/ 17 октября 2008

Возможно, у вас есть проблема с вашей реализацией в Python, использующей BaseHttpServer. Нет причин для этого "застревать", и реализация простого многопоточного сервера с использованием BaseHttpServer и threading не должна быть сложной.

Также см. http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer о реализации простого многопоточного сервера с HTTPServer и ThreadingMixIn

.
2 голосов
/ 17 октября 2008

Не многопоточный, но витой может удовлетворить ваши потребности.

1 голос
/ 18 октября 2008

У меня недавно была такая же проблема. А именно: мы написали простой сервер с использованием BaseHTTPServer и обнаружили, что тот факт, что он не является многопоточным, является большим недостатком.

Мое решение состояло в том, чтобы перенести сервер на Pylons (http://pylonshq.com/).. Порт был довольно простым, и одно из преимуществ было в том, что очень легко создать графический интерфейс с использованием Pylons, чтобы я мог добавить страницу состояния поверх того, что в основном процесс демона.

Я бы суммировал Pylons следующим образом:

  • он похож на Ruby on Rails в том смысле, что он очень прост в развертывании веб-приложений
  • это язык шаблонов по умолчанию, Мако, с ним очень приятно работать
  • использует систему маршрутизации URL, что очень удобно
  • для нас производительность не является проблемой, поэтому я не могу гарантировать, что Pylons будет работать адекватно вашим потребностям
  • вы можете использовать его с Apache & Lighthttpd, хотя я не пробовал это

Мы также запускаем приложение с Twisted и довольны им. Twisted имеет хорошую производительность, но я считаю, что модель программирования Twisted с однопоточностью / отложенным потоком довольно сложна. Он имеет много преимуществ, но не будет моим выбором для простого приложения.

Удачи.

1 голос
/ 17 октября 2008

Я использую CherryPy как лично, так и профессионально, и я очень доволен этим. Я даже делаю то, что вы описываете, например, наличие глобальных объектных кешей, запуск других потоков в фоновом режиме и т. Д. И это хорошо интегрируется с Apache; просто запустите CherryPy как отдельный сервер, связанный с localhost, затем используйте Apache mod_proxy и mod_rewrite, чтобы Apache прозрачно перенаправлял ваши запросы в CherryPy.

Веб-сайт CherryPy: http://cherrypy.org/

...