Хороший многопоточный веб-сервер python?

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

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

11 ответов


CherryPy. Особенности, как указано на веб-сайте:

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

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

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

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


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

twistd web --wsgi=your.wsgi.application

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


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


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


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

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


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

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


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

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


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

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

Я бы суммировал пилоны это путь:

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

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

удачи.


просто чтобы указать на что-то отличное от обычных подозреваемых...

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