Форум сайта python.su
Есть программа на питона, которая в ходе работы накапливает определенные оперативные данные. На фласк реализован веб интерфейс для доступа к данным. Используется встроенный веб сервер фласк. Я так понимаю, при использовании wsgi при каждом обращении к веб серверу будет запускаться новый процесс питон, в котором соответственно уже не будет текущих оперативных данных. Как реализовать веб интерфейс к приложению, чтоб только один экземпляр питон работал, обрабатывал запросы хоть с какой нибудь многопоточностью? Веб сервер фласка работает только в один поток, соответственно пока мы ждем ответ от стороннего сайта, любые попытки подключения просто висят, пока необработается первый запрос. Не могу понять, как распаралелить запросы. Как заставить один экземпляр фласк отвечать параллельно нескольким клиентам. Или как в одном приложении реализовать запуск нескольких экземпляров фласк. Фласк используется только как удобный веб интерфейс, не более.
Офлайн
Создайте отдельный процесс, который хранит оперативные данные и к которому процессы веб-интерфейса обращаются за ними. Или используйте подобное готовое: redis, memcached и т.п.
ЗЫ: можно еще попробывать перейти с flask на asynchttp, там запросы в одном потоке.
Отредактировано PooH (Май 12, 2017 05:15:38)
Офлайн
progammerСейчас вы только читаете данные, потом захотите писать и тут начнутся проблемы, синхронность, актуальность, персистентность, обслуживание и т.п. Вам правильно советуют как делать. Но для решения проблемы вам скорее всего достаточно дочитать документацию. В любом фреймвоке описывается базовая архитектура web приложения бэкэнд, подключение его к СУБД и переход от тестового сервера к прдакшн серверу типа nginx, apache, IIS … А у вас сейчас только сбор данных, даже их сохранение похоже не организовано, не говоря уж о коллективном доступе, без чего веб вообще невозможен.
чтоб только один экземпляр питон работал
Офлайн
PooHЭто “ШО” еще за пакет?
asynchttp,
Отредактировано 4kpt_V (Май 12, 2017 12:20:38)
Офлайн
progammer
Есть программа на питона, которая в ходе работы накапливает определенные оперативные данные. На фласк реализован веб интерфейс для доступа к данным. Используется встроенный веб сервер фласк. Я так понимаю, при использовании wsgi при каждом обращении к веб серверу будет запускаться новый процесс питон, в котором соответственно уже не будет текущих оперативных данных. Как реализовать веб интерфейс к приложению, чтоб только один экземпляр питон работал, обрабатывал запросы хоть с какой нибудь многопоточностью? Веб сервер фласка работает только в один поток, соответственно пока мы ждем ответ от стороннего сайта, любые попытки подключения просто висят, пока необработается первый запрос. Не могу понять, как распаралелить запросы. Как заставить один экземпляр фласк отвечать параллельно нескольким клиентам. Или как в одном приложении реализовать запуск нескольких экземпляров фласк. Фласк используется только как удобный веб интерфейс, не более.
Отредактировано 4kpt_V (Май 12, 2017 12:36:29)
Офлайн
4kpt_VЭто я хотел написать asyncio, потом вспомнил что есть aiohttp, и вот как-то вот так исправился.
Это “ШО” еще за пакет?
Андрюха обидится
Офлайн
Текущие данные хранятся в большом количестве экземпляров различных классов. Эти данные постоянно обновляются через интернет, другими людьми, создаются новые экземпляры, удаляются не актуальные. Проблема в том, что например при ручном нажатии кнопки “обновить” скрипт идет в интернет, грузит определенные данные, парсит их и обновляет поля экземпляра, и выдает ответ, допустим, “все ОК”. Пока данные обновляются, к веб интерфейсу никто обратится не может, просто висит ожидание подключения. Так как запрос идет через веб, фласк отрабатывает запрос, вызывает нужную функцию, она в свою очередь делает все необходимые обработки с данными, и возвращает ответ в функцию фласка. Соответственно все это время фласк висит и ждет возврата от функции. Я не сталкивался еще с asyncio, работаем с 3.0 питоном. Если асинк позволяет выполнить функцию асинхронно, как тогда вернуть в веб интерфейс ответ, что все прошло успешно. Может проще поднять websocket, а на фласка оставить только раздачу статики и отработку запросов? А результат обработки уже по ее окончанию возвращать на страницу через websocket? Наверное тогда проще вообще сделать одностраничное приложение. Nginx выдал всю статику, а текущие данные уже через сокеты. Но не хотелось бы еще и в JavaScript вникать серьезно. По сути задача реализовать параллельный доступ к данным в оперативной памяти, без выгрузки всего объема данных БД. Может натолкните кто нибудь на технологию, фреймворк, или похожие решения. Спасибо за внимание.
Офлайн
progammer
Если асинк позволяет выполнить функцию асинхронно, как тогда вернуть в веб интерфейс ответ, что все прошло успешно.
Офлайн
progammerТак все равно непонятно что много времени занимает. Загрузка данных или парсинг. В этом случае надежнее второй процесс для получения данных и очереди.
скрипт идет в интернет, грузит определенные данные, парсит их и обновляет поля экземпляра
Офлайн