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

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

Например, представьте, что у вас есть список [1, 2, 3, 4, 5], который вы хотите сделать двойную связь. Теперь давайте представим, как представлен список:

data DoubleList a
  = LeftEnd  a (DoubleList a)
  | Middle   a (DoubleList a) (DoubleList a)
  | RightEnd a (DoubleList a)

(для простоты я использую два разных конструктора для двух концов)

Чтобы построить список выше, вы должны сначала создайте первый элемент:

let e1 = LeftEnd  1 ...

Но для построения первого элемента вам уже нужно иметь второй элемент:

let e1 = LeftEnd  1 e2
    e2 = Middle   2 e1 ...

И для второго элемента вам понадобится третий и т. д.:

let e1 = LeftEnd  1 e2
    e2 = Middle   2 e1 e3
    e3 = Middle   3 e2 e4
    e4 = Middle   4 e3 e5
    e5 = RightEnd 5 e4

Это можно сделать в Haskell из-за ленивой оценки; эта стратегия называется «связывание узла» (и вам не нужно буквально все это помещать в одном блоке let, вы можете разделить конструкцию на функции)

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

Я бы рекомендовал вместо этого использовать Data.Sequence , который представляет собой оптимизированную реализацию последовательного хранения на основе пальца. Он поддерживает очень быструю вставку, удаление и итерацию, сохраняя при этом чисто функциональную структуру данных.

В противном случае вы можете просто использовать Zipper, но использовать их для деревьев вместо списков. Более подробную информацию о Zippers можно найти на Haskell Wiki . Молнии будут очень хорошо в этой ситуации, потому что они предлагают точную функциональность, которой вы пользуетесь: если вы посещаете дерево с помощью Zipper, вы получаете доступ к «родителям» части дерева, которое вы посещаете, но само дерево не должно содержать родительские ссылки.

13
задан NeoAnderson 17 October 2008 в 19:12
поделиться

11 ответов

CherryPy. Функции, как перечислено от веб-сайта:

  • А быстро, HTTP/1.1-compliant, WSGI объединенный потоком веб-сервер. Как правило, сам CherryPy берет только 1-2ms на страницу!
  • Поддержка любого другого WSGI-поддерживающего веб-сервера или адаптера, включая Apache, IIS, lighttpd, mod_python, FastCGI, SCGI и mod_wsgi
  • , Легкий выполнять несколько серверов HTTP (например, на нескольких портах) сразу
  • А мощная система конфигурации для разработчиков и устройств развертывания одинаково
  • А гибкая сменная система
  • Встроенные инструменты для кэширования, кодирования, сессий, авторизации, статического содержания и намного больше
  • собственный компонент А mod_python адаптер
  • , А завершают набор тестов
  • Выгружаемый и настраиваемый... все.
  • Встроенное профилирование, покрытие и тестирование поддержки.
16
ответ дан David Eyk 17 October 2008 в 19:12
поделиться
  • 1
    @davidk01: в контракте, предоставленном GetAndParse, говорится, что все реализующие его должны сделать так для любого расширения типа AnotherClass. Учитывая GetAndParse foo = new Implementor(); Вы должны способный призвать foo.getAndParse к любому расширению AnotherClass - Если компилятор didn' t осуществляют это, Вы могли точно также использовать Объект, точка дженериков должна гарантировать безопасность типов времени компиляции – Erik 18 March 2011 в 08:28

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

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

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

7
ответ дан Troy Howard 17 October 2008 в 19:12
поделиться
  • 1
    Это - причина, которая, что Вы хотите сделать, невозможна, я приношу извинения, если я структурировал его способом Вы don' t как. Дженерики времени компиляции не способны к осуществлению этого для Вас. Как компилятор должен знать то, чем подкласс будет там во времени выполнения? It' s совершенно возможный конструктор возвращается интерфейсом фабрики и приезжает из различной библиотеки you' ре, даже не компилирующее против! Сужение параметра типа не может быть проверено на безопасность во время компиляции. – Affe 18 March 2011 в 04:17

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

twistd web --wsgi=your.wsgi.application
6
ответ дан Glyph 17 October 2008 в 19:12
поделиться

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

3
ответ дан Sam Corder 17 October 2008 в 19:12
поделиться
  • 1
    Заставил его работать - простой и свободный. Спасибо! – Pat 17 January 2011 в 22:05
  • 1
    Это didn' t, кажется, работают вообще. I' ve ничего не получил после этих двух команд и долгого ожидания. – Bastes 1 July 2011 в 12:24

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

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

2
ответ дан twasbrillig 17 October 2008 в 19:12
поделиться
  • 1
    Я буду создавать новую страницу Wiki вскоре, которая показывает рекомендуемые настройки для Призмы, Меча, Микро Меча и MVVMLight – Simon 17 January 2011 в 22:20

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

2
ответ дан johnstok 17 October 2008 в 19:12
поделиться
  • 1
    Возможности фуди ограничены, это обрабатывает зависимости только в самом классе и doesn' t распространяют свойства, зависящие от свойства некоторой вложенной модели представления. Это - что-то, что может предложить PostSharp. – KolA 27 May 2014 в 03:33

web.py сделал меня счастливым в прошлом. Рассмотрите проверку его.

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

2
ответ дан 17 October 2008 в 19:12
поделиться
  • 1
    Тростник спасибо. Я добавил примечание, разъяснив, что идеальное решение будет намного более дешевым, чем 200$ (для PostSharp). Я знаю, что существует версия PS, которая является бесплатной, но я wasn' t способный достигнуть моей цели с той версией. – Pat 17 January 2011 в 20:18

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

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

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

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

Мы также, запускают приложение со Скрученным и довольны им. Скрученный имеет хорошую производительность, но я нахожу single-threaded/defer-to-thread модель программирования Twisted справедливо сложной. Это имеет много преимуществ, но не было бы моим выбором для простого приложения.

Удача.

1
ответ дан user29250 17 October 2008 в 19:12
поделиться
  • 1
    Спасибо за упоминание. Средства управления обновлением являются библиотекой отслеживания зависимости. Но это не общедоступная реализация INotifyPropertyChanged. Да, это - больше работы, чем Уведомляют Ткача Свойства. Так it' s не точно, что Вы просили в вопросе. – Michael L Perry 6 November 2013 в 21:49

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

2
ответ дан Alex Coventry 17 October 2008 в 19:12
поделиться

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

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

1
ответ дан Eli Courtwright 17 October 2008 в 19:12
поделиться
  • 1
    Я рекомендовал бы пытаться не использовать NotificationObject. Все, что это дает Вам, является методом RaisePropertyChanged. Если Вы просто реализуете INotifyPropertyChanged в модели NotifyPropertyWeaver, то введет тот метод для Вас. – Simon 17 January 2011 в 22:22
Другие вопросы по тегам:

Похожие вопросы: