Non-Message Queue/Simple Long-Polling в Python (и фляже)
Я ищу простой (т.е. не тот, который требует от меня настроить отдельный сервер для обработки очереди сообщений), чтобы делать длинный опрос для небольшого веб-интерфейса, который выполняет вычисления и создает график. Это то, что должен сделать мой веб-интерфейс:
- Пользователь запрашивает график/данные в веб-интерфейсе
- Сервер выполняет некоторые вычисления.
- Пока на сервере выполняются вычисления, небольшой контейнер обновляется (вероятно, через AJAX/jQuery) с расчетом прогресса (аналогично тому, что вы делали бы в консоли с печатью (т.е. печатать "вычисление функции плотности..." ) ))
- Окончание вычислений и график отображаются пользователю.
Поскольку расчет все делается на стороне сервера, я не уверен, как легко это установить. Очевидно, я хочу настроить REST API для обработки опроса, что было бы легко в Flask. Однако я не уверен, как получить фактические обновления. Очевидной, хотя и сложной для этой цели, было бы решение настроить очередь сообщений и сделать длинный опрос. Однако я не уверен, что это правильный подход для чего-то такого простого.
Вот мои вопросы:
- Есть ли способ сделать это с помощью файловой системы? Производительность не является большой проблемой. Может ли AJAX/jQuery найти сообщения из файла? Сохранить прогресс в файле .json?
- Как насчет травления? (Я не очень много знаю о травлении, но, возможно, я мог бы рассортировать сообщение dict, и это может быть прочитано API, который обрабатывает опрос).
- Является ли опрос даже правильным? Есть ли лучший или более общий шаблон для этого?
У меня такое чувство, что я преувеличиваю вещи, поскольку я знаю, что подобные вещи распространены в Интернете. Довольно часто я вижу, что что-то происходит, и небольшое изображение "loading.gif" работает во время выполнения некоторых вычислений (например, в Google Analytics).
Спасибо за вашу помощь!
Ответы
Ответ 1
Я создал несколько таких приложений, используя только Flask и jQuery. Основываясь на этом опыте, я бы сказал, что ваш план хорош.
-
Не используйте файловую систему.. Вы столкнетесь с проблемами безопасности/защитой JavaScript. В маловероятном случае вы найдете разумные обходные пути, вы все равно не будете иметь ничего портативного или масштабируемого. Вместо этого используйте небольшую локальную веб-службу, например Flask.
-
Не рассосайтесь. Используйте JSON. Это язык веб-приложений и интерфейсов REST. jQuery и те симпатичные плагины, основанные на jQuery для рисования диаграмм, графиков и т.д., ожидают JSON. Он прост в использовании, удобен для восприятия человеком и для небольших приложений, поэтому нет причин идти в другое место.
-
Длительный опрос отлично подходит для того, что вы хотите выполнить. Чистые приложения на основе HTTP имеют некоторые ограничения. И WebSockets и подобные сокет-иш-слои, такие как Socket.IO, - это будущее. Но найти хорошие, простые примеры серверной реализации, по моему опыту, было трудно. Я посмотрел тяжело. Существует множество примеров, которые вы хотите настроить Node.js, REDIS и другие компоненты промежуточного программного обеспечения. Но зачем нам устанавливать два или три отдельных промежуточных сервера? Это смешно. Таким образом, длительный опрос на простой, чистой-Python веб-фреймворке, такой как Flask, является способом выхода IMO.
Код немного больше, чем фрагмент, поэтому вместо того, чтобы включать его здесь, я привел упрощенный пример в репозиторий Mercurial на битбакет чтобы вы могли свободно просматривать, копировать или клонировать. Есть три части:
-
serve.py
сервер на основе Python/Flask
-
templates/index.html
98% HTML, 2% -ный файл шаблонов, созданный на основе флагов, будет отображаться как HTML
-
static/lpoll.js
клиент на основе jQuery
Ответ 2
Длительный опрос был разумной практикой, прежде чем простая, естественная поддержка веб-сокетов появилась в большинстве браузеров, и до того, как она была легко интегрирована вместе с приложениями Flask. Но здесь, в середине 2013 года, поддержка Web Socket прошла долгий путь.
Вот пример, аналогичный приведенному выше, но включающий Flask и Web Sockets. Он запускается поверх серверных компонентов из gevent и gevent-websocket.
Примечание. Этот пример не является шедевром веб-гнезда. Он сохраняет много структуры lpoll
, чтобы сделать их более легко сопоставимыми. Но это сразу улучшает отзывчивость, накладные расходы сервера и интерактивность веб-приложения.