Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2017 01:18:00

progammer
Зарегистрирован: 2017-05-12
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Веб интерфейс

Есть программа на питона, которая в ходе работы накапливает определенные оперативные данные. На фласк реализован веб интерфейс для доступа к данным. Используется встроенный веб сервер фласк. Я так понимаю, при использовании wsgi при каждом обращении к веб серверу будет запускаться новый процесс питон, в котором соответственно уже не будет текущих оперативных данных. Как реализовать веб интерфейс к приложению, чтоб только один экземпляр питон работал, обрабатывал запросы хоть с какой нибудь многопоточностью? Веб сервер фласка работает только в один поток, соответственно пока мы ждем ответ от стороннего сайта, любые попытки подключения просто висят, пока необработается первый запрос. Не могу понять, как распаралелить запросы. Как заставить один экземпляр фласк отвечать параллельно нескольким клиентам. Или как в одном приложении реализовать запуск нескольких экземпляров фласк. Фласк используется только как удобный веб интерфейс, не более.

Офлайн

#2 Май 12, 2017 05:12:28

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Веб интерфейс

Создайте отдельный процесс, который хранит оперативные данные и к которому процессы веб-интерфейса обращаются за ними. Или используйте подобное готовое: redis, memcached и т.п.

ЗЫ: можно еще попробывать перейти с flask на asynchttp, там запросы в одном потоке.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Май 12, 2017 05:15:38)

Офлайн

#3 Май 12, 2017 07:45:33

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Веб интерфейс

progammer
чтоб только один экземпляр питон работал
Сейчас вы только читаете данные, потом захотите писать и тут начнутся проблемы, синхронность, актуальность, персистентность, обслуживание и т.п. Вам правильно советуют как делать. Но для решения проблемы вам скорее всего достаточно дочитать документацию. В любом фреймвоке описывается базовая архитектура web приложения бэкэнд, подключение его к СУБД и переход от тестового сервера к прдакшн серверу типа nginx, apache, IIS … А у вас сейчас только сбор данных, даже их сохранение похоже не организовано, не говоря уж о коллективном доступе, без чего веб вообще невозможен.

p.s.
Кстати для совсем тупых приложений мы сейчас такой подход используем. В приложение поставщик данных вставляется сервер (у нас поставщик это обычно что-то компилируемое но может быть и на питоне) У сервера есть всего две функции зарегистрировать данные и step(int i) - обработать запросы клиентов. step вставляется в кусок кода который достаточно часто вызывается. Регистрируются просто типизированные области памяти в стиле numpy тип в стиле dtype. Обмен сделан на zeromq. В нашей реализации допустим запрос данных установка данных и регистрация групп переменных для коллективного обмена и запрос перечня переменных. Клиент может затребовать переход сервера в синхронный режим. Тогда он не выходит из режима обмена данными до явного получения команды step(int nstep). Есть реализации клиента и сервера на питоне, c++, C. Этой штукой управляли программами на python,C++,fortran,pascal. Напоминает opc-ua, но у нас у сервера есть эффективный строго синхронный режим, что необходимо для Управления расчетными программами организации тестирования и т.п.



Офлайн

#4 Май 12, 2017 12:15:40

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Веб интерфейс

PooH
asynchttp,
Это “ШО” еще за пакет?
Андрюха обидится

Отредактировано 4kpt_V (Май 12, 2017 12:20:38)

Офлайн

#5 Май 12, 2017 12:18:53

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Веб интерфейс

progammer
Есть программа на питона, которая в ходе работы накапливает определенные оперативные данные. На фласк реализован веб интерфейс для доступа к данным. Используется встроенный веб сервер фласк. Я так понимаю, при использовании wsgi при каждом обращении к веб серверу будет запускаться новый процесс питон, в котором соответственно уже не будет текущих оперативных данных. Как реализовать веб интерфейс к приложению, чтоб только один экземпляр питон работал, обрабатывал запросы хоть с какой нибудь многопоточностью? Веб сервер фласка работает только в один поток, соответственно пока мы ждем ответ от стороннего сайта, любые попытки подключения просто висят, пока необработается первый запрос. Не могу понять, как распаралелить запросы. Как заставить один экземпляр фласк отвечать параллельно нескольким клиентам. Или как в одном приложении реализовать запуск нескольких экземпляров фласк. Фласк используется только как удобный веб интерфейс, не более.

Что значит “оперативных данных”?

Отредактировано 4kpt_V (Май 12, 2017 12:36:29)

Офлайн

#6 Май 12, 2017 14:01:46

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Веб интерфейс

4kpt_V
Это “ШО” еще за пакет?
Андрюха обидится
Это я хотел написать asyncio, потом вспомнил что есть aiohttp, и вот как-то вот так исправился.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Май 12, 2017 17:20:35

progammer
Зарегистрирован: 2017-05-12
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Веб интерфейс

Текущие данные хранятся в большом количестве экземпляров различных классов. Эти данные постоянно обновляются через интернет, другими людьми, создаются новые экземпляры, удаляются не актуальные. Проблема в том, что например при ручном нажатии кнопки “обновить” скрипт идет в интернет, грузит определенные данные, парсит их и обновляет поля экземпляра, и выдает ответ, допустим, “все ОК”. Пока данные обновляются, к веб интерфейсу никто обратится не может, просто висит ожидание подключения. Так как запрос идет через веб, фласк отрабатывает запрос, вызывает нужную функцию, она в свою очередь делает все необходимые обработки с данными, и возвращает ответ в функцию фласка. Соответственно все это время фласк висит и ждет возврата от функции. Я не сталкивался еще с asyncio, работаем с 3.0 питоном. Если асинк позволяет выполнить функцию асинхронно, как тогда вернуть в веб интерфейс ответ, что все прошло успешно. Может проще поднять websocket, а на фласка оставить только раздачу статики и отработку запросов? А результат обработки уже по ее окончанию возвращать на страницу через websocket? Наверное тогда проще вообще сделать одностраничное приложение. Nginx выдал всю статику, а текущие данные уже через сокеты. Но не хотелось бы еще и в JavaScript вникать серьезно. По сути задача реализовать параллельный доступ к данным в оперативной памяти, без выгрузки всего объема данных БД. Может натолкните кто нибудь на технологию, фреймворк, или похожие решения. Спасибо за внимание.

Офлайн

#8 Май 12, 2017 20:57:58

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Веб интерфейс

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

Да. aiohttp позволяет делать некоторые вещи асинхронно а “разруливание” кому и чего вернуть aiohttp берет на себя. Это, фактически, не проблема разработчика.

Ну и вообще. Хранение данных внутри объектов… Ну как-бы уже идея пугает насмерть. Почему не используется БД? Дальше. Чтобы не менять веб фремверк, можно такие задачи убирать подальше и выполнять в отдельном процессе - использовать отдельные task-воркеры. Т.е. поставили задачу в очередь. Воркер до нее доберется когда освободится и результат запишет в БД. А уже при запросе Вы спрашиваете не у воркера а у БД. Самый простой из них: RQ.

Офлайн

#9 Май 13, 2017 09:18:40

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Веб интерфейс

progammer
скрипт идет в интернет, грузит определенные данные, парсит их и обновляет поля экземпляра
Так все равно непонятно что много времени занимает. Загрузка данных или парсинг. В этом случае надежнее второй процесс для получения данных и очереди.

Ну и идеологически непонятно. Пользователь нажал кнопку - должен получить актуальное состояние на момент нажатия или последнее обновленное кем-то состояние? Если первое то он должен ждать. Если второе то кто инициирует обновление?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version