В 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, вы получаете доступ к «родителям» части дерева, которое вы посещаете, но само дерево не должно содержать родительские ссылки.
CherryPy. Функции, как перечислено от веб-сайта:
Рассмотрите пересмотр Вашего дизайна. Поддержание так большого количества состояния в Вашем веб-сервере является, вероятно, плохой идеей. Мультипроцесс является намного лучшим способом пойти для устойчивости.
там другой способ совместно использовать состояние между отдельными процессами? Что относительно сервиса? База данных? Индекс?
кажется маловероятным, что поддержание огромного массива данных в памяти и доверие единственному многопоточному процессу для обслуживания всех запросов являются лучшим дизайном или архитектурой для приложения.
Скрученный может служить таким веб-сервером. В то время как не многопоточный самостоятельно, существует (еще не выпущено) многопоточный контейнер WSGI, существующий в текущей соединительной линии. Можно проверить репозиторий SVN и затем работать:
twistd web --wsgi=your.wsgi.application
Ее твердое для предоставления категорического ответа, не зная, какой сайт Вы продолжаете работать и какую загрузку Вы ожидаете. Sub вторая производительность может быть серьезным требованием или она не может. Если действительно необходимо сохранить ту последнюю миллисекунду тогда, абсолютно необходимо сохранить массивы в памяти. Однако, поскольку другие предположили, что более, чем вероятно, что Вы не делаете и могли обойтись чем-то еще. Ваш шаблон использования данных в массиве может влиять на то, какие виды выбора Вы делаете. Вам, вероятно, не нужен доступ ко всему набору данных из массива внезапно, таким образом, Вы могли разбить свои данные в меньшие блоки и поместить те блоки в кэш вместо одной большой глыбы. В зависимости от того, как часто должны быть обновлены Ваши данные массива, Вы могли бы сделать выбор между memcached, локальный дб (berkley, sqlite, маленькая mysql установка, и т.д.) или удаленный дб. Я сказал бы memcached для довольно частых обновлений. Локальный дб для чего-то в частоте почасовых и удаленных для частоты ежедневной газеты. Одна вещь рассмотреть также - то, что происходит после неудачного обращения в кэш. Если 50 клиентов внезапно получают неудачное обращение в кэш, и все они одновременно решают начать повторно создавать те дорогие массивы, Ваше поле (поля) будет быстро уменьшено до 8086. Таким образом, необходимо принять к соображению, как Вы обработаете это. Много статей там касаются, как восстановиться с неудачных обращений в кэш. Надежда это полезно.
Только указать на что-то другое от обычных подозреваемых...
Несколько лет назад, в то время как я использовал Zope 2.x, я считал [приблизительно 111] Medusa, поскольку это был веб-сервер, используемый для платформы. Они рекламировали его для работы хорошо под большой нагрузкой, и это может предоставить Вам функциональность, которую Вы спросили.
Возможно, у Вас есть проблема с Вашей реализацией в Python с помощью BaseHttpServer
. Нет никакой причины его для "застревания", и реализация простого потокового сервера с помощью BaseHttpServer
и threading
не должна быть трудной.
кроме того, см. http://pymotw.com/2/BaseHTTPServer/index.html#module-BaseHTTPServer о реализации простого многопоточного сервера с HTTPServer
и ThreadingMixIn
Вы могли вместо этого использовать распределенный кэш, который доступен от каждого процесса, memcached, являющийся примером, который приходит на ум.
web.py сделал меня счастливым в прошлом. Рассмотрите проверку его.
, Но это действительно кажется, что архитектурная модернизация могла бы быть надлежащим, хотя более дорогой, решением.
У меня на самом деле недавно была та же проблема. А именно: мы записали простому использованию сервера BaseHTTPServer и нашли, что то, что это не является многопоточным, было большим недостатком.
Мое решение состояло в том, чтобы портировать сервер на Опоры ( http://pylonshq.com/ ). Порт был довольно легок, и одно преимущество было, очень легко создать GUI с помощью Опор, таким образом, я смог бросить страницу состояния сверху того, что является в основном процессом демона.
я суммировал бы Опоры этот путь:
Мы также, запускают приложение со Скрученным и довольны им. Скрученный имеет хорошую производительность, но я нахожу single-threaded/defer-to-thread модель программирования Twisted справедливо сложной. Это имеет много преимуществ, но не было бы моим выбором для простого приложения.
Удача.
Не многопоточный, но скрутил , мог бы удовлетворить Ваши потребности.
Я использую CherryPy и лично и профессионально, и я чрезвычайно доволен им. Я даже делаю виды вещи, которую Вы описываете, такие как наличие кэшей глобального объекта, выполнение других потоков в фоновом режиме, и т.д. И это интегрируется хорошо с Apache; просто выполните CherryPy как автономный сервер, связанный с localhost, затем используйте Apache mod_proxy
, и mod_rewrite
для имения Apache прозрачно передают запросы к CherryPy.
веб-сайт CherryPy http://cherrypy.org/
GetAndParse foo = new Implementor();
Вы должны способный призватьfoo.getAndParse
к любому расширению AnotherClass - Если компилятор didn' t осуществляют это, Вы могли точно также использовать Объект, точка дженериков должна гарантировать безопасность типов времени компиляции – Erik 18 March 2011 в 08:28