Хороший многопоточный веб-сервер 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, поскольку это был веб-сервер, используемый для платформы. Они рекламировали его, чтобы он работал хорошо при большой нагрузке, и он может предоставить вам необходимую вам функциональность.