Задача - нужно непрерывно обрабатывать некий поток данных и делать на их основе какие-то вычисления, которые потом куда-то передавать. Назовем код который решает эту задачу обработчиком.
Обработчиком надо управлять. К примеру через веб-интерфейс на django. Например, на время остановить или изменить алгоритм обработки, при этом настройки должны быть персистентными.
Завязывать обработчик на базу данных (django models) или какую-либо систему передачи информации было бы, я думаю, не верно. Соответственно, встает вопрос как их развязать.
Напрашивается создание remote-facade, только как его сделать в питоне мне не очень понятно.
Т.е. в моем понимании должен быть объект, у которого есть коллекция обработчиков (их может быть много). Работать они должны параллельно друг другу. Он с помощью какого-то средства межпроцессорного взавимодействия получает команды и исполняет их вызывая методы соответствующего обработчика.
Только вот в питоне нет настоящей concurrency. Поэтому обработчик выходит надо делать в отдельном процессе. А это значит опять нужно какое-то средство межпроцессорного взаимодействия.
Так вот два вопроса:
Есть ли стандартное решение для связи django с application-server-ом? Как это правильно организовать? Использовать ли redis, zmq или что-то еще?
И как правильно организовать создание и управление обработчиками (zmq, rpc, что-то еще...)?
@kazmiruk Я читаю документацию на торнадо и gevent и пока все что я вижу - это решение задачи, когда надо на вебсервер поступает запрос, на который надо выдать ответ. Типа посчитать цену за выбранные товары или какие-то сложные вычисления и идет речь о балансировке нагрузки, асинхронном коде и пр. Но я не вижу как это связано с моей задачей, где есть процесс, которым надо управлять из веба.
делаем на gevent сервер приложений, один из гринлетов которого слушает новые задачи из gearman. При поступлении задачи создаем гринлет с обработчиком поступившей задачи. И так до бесконечности. Если в качестве задачи пришло изменение задачи - ищем нужный гринлет и говорим что изменилось (к примеру задача завершилась). Веб сервер фактически при нажатии кнопки помещает нужную задачу в gearman. Вроде и все. Это конечно элементарное приближение, но в целом суть должна быть понятна