Форум сайта python.su
Господа, расскажите нубу как реализовать такую штуку.
Есть веб-приложение которое крутится на cherrypy. Хочу добавить в него функционал который будет выполняться довольно долго (5-10 минут всяких расчетов и вывода в файлы) и при этом обеспечить, чтобы одновременно только один процесс выполняющий данный функционал мог быть запущен.
То есть грубо говоря если кто-то из пользователей у себя в браузере на страничке нажал кнопку и запустил расчет, то у остальных чтобы сразу эта кнопка стала недоступна пока у первого не посчитается.
Ну и до кучи хотелось бы чтобы даже если инициатор расчета обновит страничку - у него тоже все было недоступно пока не досчитается.
И желательно пока идет расчет еще и показывать прогресс всем интересующимся.
Я пытался найти сам, везде все сводится к Celery/RabbitMQ/snakeMQ - в общем брокеры сообщений и очереди задач. Но по описаниям и примерам я не очень понял как реализовать то, что мне надо, да и вообще подходит ли это все.
Офлайн
Очереди сообщений нужны, когда у вас есть постоянный поток задач, которые вы хотите выполнять в бэкграунде. Вам по сути надо запустать отдельный процесс с задачей и каким-то образом блокировать его повторный запуск. Вариантов может быть масса, например, записывать значение в БД или создавать Lock file.
Ну а прогресс задачи вещь вообще нетривиальная. Вот, допустим, ваш скрипт сначала парсит десять разных сайтов, потом считает какие-то данные, записывает их в файл и рассылает СМС-ки администраторам. Как вы будете определять прогресс? Где будет середина выполнения задачи? В любом случае, скрипт сам должен определять свое состояние и куда-то его периодически записывать.
Офлайн
Мысль про флажок в БД посещала и меня, и в принципе это наверное и будет самым простым решением. Как минимум при попытках пользователей запустить лишний расчет можно будет давать отлуп.
Но хотелось бы активно оповещать клиентские интерфейсы о том что флажок поднят/опущен.
Вебсокеты такое могут? Опять же судя по примерам в инете через вебсокеты можно слать сообщения всем подписанным на канал. Но я не понимаю как быть если новый пользователь открывает страничку с интерфейсом и подписывается на канал? Лупить сообщение на сервере, что поднят флажок в цикле, пока не опустится? Делать запрос со стороны пользователя о состоянии флажка?
Я никогда с ними не сталкивался поэтому не могу представить что они умеют и для чего полезны.
Офлайн
Ну, вариантов всего два - либо у вас классический веб, и тогда каждый клиент должен периодически спрашивать сервер о состоянии, либо веб-сокет, тогда киент может слушать сообщения от сервера и сервер может сообщить о росте прогресса и изменении состояния задачи.
Офлайн
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
Офлайн