Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Web
  • » Глобальный семафор в веб-приложении [RSS Feed]

#1 Дек. 17, 2019 13:47:57

steelunicorn
Зарегистрирован: 2018-06-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Глобальный семафор в веб-приложении

Господа, расскажите нубу как реализовать такую штуку.
Есть веб-приложение которое крутится на cherrypy. Хочу добавить в него функционал который будет выполняться довольно долго (5-10 минут всяких расчетов и вывода в файлы) и при этом обеспечить, чтобы одновременно только один процесс выполняющий данный функционал мог быть запущен.
То есть грубо говоря если кто-то из пользователей у себя в браузере на страничке нажал кнопку и запустил расчет, то у остальных чтобы сразу эта кнопка стала недоступна пока у первого не посчитается.
Ну и до кучи хотелось бы чтобы даже если инициатор расчета обновит страничку - у него тоже все было недоступно пока не досчитается.
И желательно пока идет расчет еще и показывать прогресс всем интересующимся.

Я пытался найти сам, везде все сводится к Celery/RabbitMQ/snakeMQ - в общем брокеры сообщений и очереди задач. Но по описаниям и примерам я не очень понял как реализовать то, что мне надо, да и вообще подходит ли это все.

Офлайн

#2 Дек. 17, 2019 14:17:57

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8006
Репутация: +  558  -
Профиль   Отправить e-mail  

Глобальный семафор в веб-приложении

Очереди сообщений нужны, когда у вас есть постоянный поток задач, которые вы хотите выполнять в бэкграунде. Вам по сути надо запустать отдельный процесс с задачей и каким-то образом блокировать его повторный запуск. Вариантов может быть масса, например, записывать значение в БД или создавать Lock file.
Ну а прогресс задачи вещь вообще нетривиальная. Вот, допустим, ваш скрипт сначала парсит десять разных сайтов, потом считает какие-то данные, записывает их в файл и рассылает СМС-ки администраторам. Как вы будете определять прогресс? Где будет середина выполнения задачи? В любом случае, скрипт сам должен определять свое состояние и куда-то его периодически записывать.



Офлайн

#3 Дек. 17, 2019 15:27:05

steelunicorn
Зарегистрирован: 2018-06-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Глобальный семафор в веб-приложении

Мысль про флажок в БД посещала и меня, и в принципе это наверное и будет самым простым решением. Как минимум при попытках пользователей запустить лишний расчет можно будет давать отлуп.
Но хотелось бы активно оповещать клиентские интерфейсы о том что флажок поднят/опущен.

Вебсокеты такое могут? Опять же судя по примерам в инете через вебсокеты можно слать сообщения всем подписанным на канал. Но я не понимаю как быть если новый пользователь открывает страничку с интерфейсом и подписывается на канал? Лупить сообщение на сервере, что поднят флажок в цикле, пока не опустится? Делать запрос со стороны пользователя о состоянии флажка?
Я никогда с ними не сталкивался поэтому не могу представить что они умеют и для чего полезны.

Офлайн

#4 Дек. 17, 2019 15:33:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8006
Репутация: +  558  -
Профиль   Отправить e-mail  

Глобальный семафор в веб-приложении

Ну, вариантов всего два - либо у вас классический веб, и тогда каждый клиент должен периодически спрашивать сервер о состоянии, либо веб-сокет, тогда киент может слушать сообщения от сервера и сервер может сообщить о росте прогресса и изменении состояния задачи.



Офлайн

#5 Дек. 18, 2019 11:06:42

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2250
Репутация: +  40  -
Профиль   Отправить e-mail  

Глобальный семафор в веб-приложении

http://docs.celeryproject.org/en/latest/tutorials/task-cookbook.html#ensuring-a-task-is-only-executed-one-at-a-time если брать Celery

если операция разовая, то в Cherrypy есть своя шина и плагин cherrypy.process.plugins.BackgroundTask

Офлайн

  • Начало
  • » Web
  • » Глобальный семафор в веб-приложении[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version