Сервер кометы Python

Для меня все объяснения здесь были ужасны, так как я не получил часть поиска / сортировки. Как мы ищем / сортируем, было неясно.

Мы все знаем, что нам нужно построить prefixSum, что означает sum of all elems from 0 to i with modulo m

Я думаю, то, что мы ищем, ясно. Зная, что subarray[i][j] = (prefix[i] - prefix[j] + m) % m (с указанием суммы по модулю от индекса i до j), наши максимумы при заданном префиксе [i] всегда являются тем префиксом [j], который максимально приближен к префиксу [i], но немного больше.

например. для m = 8, префикс [i] равен 5, мы ищем следующее значение после 5, которое находится в нашем prefixArray.

Для эффективного поиска (бинарный поиск) мы сортируем префиксы.

Что мы не можем сделать, так это сначала построить prefixSum, а затем выполнить итерацию снова от 0 до n и искать индекс в отсортированном массиве префиксов, потому что мы можем найти и endIndex, который меньше, чем наш startIndex, что не годится.

Следовательно, мы делаем итерацию от 0 до n, указывая endIndex нашей потенциальной максимальной суммы подмассива, а затем просматриваем наш отсортированный префиксный массив (который в начале пуст), который содержит отсортированные префиксы между 0 и endIndex.

def maximumSum(coll, m):
    n = len(coll)
    maxSum, prefixSum = 0, 0
    sortedPrefixes = []

    for endIndex in range(n):
        prefixSum = (prefixSum + coll[endIndex]) % m
        maxSum = max(maxSum, prefixSum)

        startIndex = bisect.bisect_right(sortedPrefixes, prefixSum)
        if startIndex < len(sortedPrefixes): 
            maxSum = max(maxSum, prefixSum - sortedPrefixes[startIndex] + m)

        bisect.insort(sortedPrefixes, prefixSum)

    return maxSum
31
задан Makoto 18 May 2015 в 01:26
поделиться

7 ответов

Я рекомендую вам использовать StreamHub Comet Server - его используют многие люди - лично я использую его с парой сайтов Django, которые я запускаю. Вам нужно будет написать крошечный кусочек Java для обработки потоковой передачи - я сделал это с помощью Jython . Интерфейсный код представляет собой действительно простой Javascript а-ля:

StreamHub hub = new StreamHub();
hub.connect("http://myserver.com/");
hub.subscribe("newsfeed", function(sTopic, oData) { alert("new news item: " + oData.Title); });

Документация довольно хороша - у меня были проблемы, похожие на те, что вы пытались начать с разреженными документами Cometd et al. Для начала я бы прочитал Начало работы с Comet и StreamHub , загрузите и посмотрите, как работают некоторые примеры, и обратитесь к документации API, если вам нужно:

9
ответ дан 27 November 2019 в 22:40
поделиться

Я этого не делал, но этот парень написал хорошую статью об этом, с примерами Django и указателями (которые я не проверял) на другие каркасы.

2
ответ дан 27 November 2019 в 22:40
поделиться

Я сделал множество API-интерфейсов, используя twisted для подобных вещей, большинство из которых доступно в моей учетной записи github .

Большинство из них - клиентские, но slosh - это сервер, который я написал, чтобы делать что-то вроде дешевых pubsub в реальном времени. Он немного масштабируется по горизонтали для чтения, позволяя выполнять простую потоковую репликацию. Запись немного отличается, когда вы придерживаетесь простого HTTP, но я протолкнул приличную сумму для демонстрации.

В противном случае у вас есть полноценный BOSH, который поддерживает большинство серверов XMPP и позволит вам разделить сообщение распространение из веб-интерфейса.

4
ответ дан 27 November 2019 в 22:40
поделиться

Orbited кажутся хорошим решением. Однако не пробовал.


Обновление : за последние 2,5 года все изменилось.

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

13
ответ дан 27 November 2019 в 22:40
поделиться

Вот полнофункциональный пример объединения Django, Orbited и Twisted для создания приложения реального времени (Comet): http://github.com/clemesha/hotdot с использованием Python.

6
ответ дан 27 November 2019 в 22:40
поделиться

решения orbited и redis хороши, но уже не актуальны, когда есть что-то вроде PubSubHubbub, который выпустил google. Это позволяет очень легко быть издателем или подписчиком данного фида. http://code.google.com/p/pubsubhubbub/

1
ответ дан 27 November 2019 в 22:40
поделиться

Вот пример, который выполняет длинный опрос с gevent и Django .

Он использует greenlet - функцию переключения стека из Stackless, упакованную как расширение CPython.

1
ответ дан 27 November 2019 в 22:40
поделиться
Другие вопросы по тегам:

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