Форум сайта python.su
Доброго дня. Никак не могу сообразить как писать в базу (через модель) полученные данные после работы воркера. Схема такая. Использую django-rq. Через форму получаю данные от пользователя, и отправляю в очередь. Где-то там воркер отдаёт либе данные пользователя, либа эти данные переваривает, делает что нужно и отдает результаты.
И тут вопрос. Результат можно хранить в Redis (в RQ опция result_ttl). Вот как бы получать эти данные. Можно при получении данных от пользователя писать UUID задачи, потом по этому UUID проверять состояние. И через return_value класса rq.job.Job получать что там либа отдала и писать в базу. Для этого можно заходить по определенному URL (использовать для этого cron) в методе которого и будет обход соответствующих полей базы, сбора UUID и получение результата. Но этот метор пахнет велосипедостроительством (великий могучий…).
Можно даже результат в другую очередь кидать. Воркет будет слушать и писать в базу эти результаты. Но я не могу понять как получить доступ к модели. Именно связка django ORM + воркер не понятно как реализовать. Может примером ударите?… Может я конечно не очень понимаю как строятся подобные приложения. Опыта в подобных аппах нет..
Офлайн
Используйте кастомные команды. https://docs.djangoproject.com/en/1.9/howto/custom-management-commands/
Ну или нужно настройки джанги в скрипте указать
sys.path.append(project_path) os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
Отредактировано ayb (Фев. 1, 2016 14:42:44)
Офлайн
ayb
Про кастомные команды более менее понятно. Геморройно, надо тестить. Я так понял именно через этот способ нужно поднимать воркер, слушать очередь и принимать данные… Там, кстати, уже есть rqworker и rqscheduler. Надо их глянуть..
Офлайн
Не, что-то всё не то. Постоянно какие-то велосипеды. И что самое неприятное так это то, что и на сайте и на удалённом сервере нужно держать либу которой хочешь воспользоваться. Я подумал об API. Но сейчас я подобное не потяну. Хотя API при использовании JSON подходит идеально. Не нужно ничего держать на сайте (лишних бибилиотек) и на удалённой машине.
Офлайн
Пока занимался JS, подумал о другом способе. Короче решение такое, стукнуло в голову совершенно случайно, проверил работает…
django_rq.enqueue('libtask.task.launcher', *task, **rq_options)
Офлайн
А почему-бы в RQ сразу не писать в БД?
k0st1an
Т.е. в параметре f= указывать строку того, что хотите использовать на удаленном сервере. В этом случае из окружения django проекта можно смело выбрасывать все не нужное. И таким же способом слать задания обратно, в django.
Офлайн
4kpt_IV
Есть три сервера (физически разные): web, redisq, server. Надо с web отправить на server задание. если отправлять так:
django_rq.enqueue(libtask.task.launcher, *task, **rq_options)
django_rq.enqueue('libtask.task.launcher', *task, **rq_options)
Офлайн
Где модели? Где база? На каком из серверов?
Таким образом можно было вообще послать заглушку, которая вызовет нужную функцию при вызове.
Получается Вы из одного сервера посылаете путь к пакету, которого на нем нет, но должен быть на другом сервере? Я правильно понимаю?
Офлайн
4kpt_IVВерно. Там пакет точно есть. В идеале мне нужно отправить только вот это:
Получается Вы из одного сервера посылаете путь к пакету, которого на нем нет, но должен быть на другом сервере? Я правильно понимаю?
{'task': 12121, 'action': 'define'}
Офлайн
Мне кажется RQ это не совсем то, что Вам надо. Обычную очередь и все. С одной стороны: посыл в очередь. С другой стороны: приемник - обработчик. У RQ другие задачи. А еще и с тем учетом, что на стороне сервера крутится полноценно приложение, то вообще непонятно на кой он тут.
Офлайн