Как осуществить мониторинг выполнения процесса в реальном времени через ajax?
Добрый день. Суть такая: через ajax отправляю на сервер команду выполнить какое-то действие, скажем, генерация кучи картинок, как лучше реализовать мониторинг за прогрессом выполнения скрипта? Например, в реальном времени отобразить сколько еще в процентах выполняться скрипту и при необходимости остановить его выполнение? Фронт и бекэнд - на питоне джанговском.
Процесс запускай в celery, там можно таску отменить, если требуется. Интеграция с Django есть.
Сообщение можно организовать через centrifuge. На клиенте подписываемся на канал, на бекенде пишем в него. На Хабре есть статьи про centrifuge
Но это схема по хардкору и с некоторым оверхедом)
делайте fork процесса с апдейтом базы - читайте оттуда параметр для ajax-a.
при каждом апдейте - делайте проверку на команду: появилась - выполняем.
табличка БД для понимания:
ID,script_name,status,completed,command
допустим у вас есть 100 картинок, значит за 100% времени нам нужно обработать 100 изображений по 1му проценту на изображение
на js пишем функцию которая отсылает запрос на сервер и по возвращению ответа наращивает прогресс бар на 1 процент, и вызывает сама себя, как только доходим до 100 % прекращаем вызов самой себя и все готово
Я примерно подобное сделал, только немного с "граблями"- в текстовый документ записывается число и js отталкиваясь от того, какое там число выводит мне определенный процент) Это, я так понял, везде схожий принцип идет, но вот как убить процесс, чтоб не ждать окончания?
Эдик: не, я имел ввиду, чтоб убить процесс на серваке: когда выполняется скрипт, то через менеджер процессов, тот же top, на 100% грузится python, вот как его бы убить и перезапустить через аякс...
если есть возможность во время запроса проверить состояние сервера, если высокая нагрузка, то отсылать на js флаг, "типа стоп процесс", посмотрите у sypex.net
Обычно делается так. Вы отправляете запрос на обработку картинок на сервер. Там оцениваете время работы примерно. Потом создаете файлик worker/process.json и туда ложите {done:0} что значит 0%.
Теперь в своем яваскрипте, сразу после запуска аякса, запускаете setInterval b через каждые 200ms читаете этот файл и его значение используете для прогресбара.
А когда аякс закончит работу, прерываете setInterval и назначаете прогрес бар на 100%.