Найти - Пользователи
Полная версия: django, worker, models
Начало » Django » django, worker, models
1 2 3 4
k0st1an
Доброго дня. Никак не могу сообразить как писать в базу (через модель) полученные данные после работы воркера. Схема такая. Использую django-rq. Через форму получаю данные от пользователя, и отправляю в очередь. Где-то там воркер отдаёт либе данные пользователя, либа эти данные переваривает, делает что нужно и отдает результаты.


И тут вопрос. Результат можно хранить в Redis (в RQ опция result_ttl). Вот как бы получать эти данные. Можно при получении данных от пользователя писать UUID задачи, потом по этому UUID проверять состояние. И через return_value класса rq.job.Job получать что там либа отдала и писать в базу. Для этого можно заходить по определенному URL (использовать для этого cron) в методе которого и будет обход соответствующих полей базы, сбора UUID и получение результата. Но этот метор пахнет велосипедостроительством (великий могучий…).


Можно даже результат в другую очередь кидать. Воркет будет слушать и писать в базу эти результаты. Но я не могу понять как получить доступ к модели. Именно связка django ORM + воркер не понятно как реализовать. Может примером ударите?… Может я конечно не очень понимаю как строятся подобные приложения. Опыта в подобных аппах нет..
ayb
Используйте кастомные команды. https://docs.djangoproject.com/en/1.9/howto/custom-management-commands/

Ну или нужно настройки джанги в скрипте указать

sys.path.append(project_path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
k0st1an
ayb
Про кастомные команды более менее понятно. Геморройно, надо тестить. Я так понял именно через этот способ нужно поднимать воркер, слушать очередь и принимать данные… Там, кстати, уже есть rqworker и rqscheduler. Надо их глянуть..
k0st1an
Не, что-то всё не то. Постоянно какие-то велосипеды. И что самое неприятное так это то, что и на сайте и на удалённом сервере нужно держать либу которой хочешь воспользоваться. Я подумал об API. Но сейчас я подобное не потяну. Хотя API при использовании JSON подходит идеально. Не нужно ничего держать на сайте (лишних бибилиотек) и на удалённой машине.
k0st1an
Пока занимался JS, подумал о другом способе. Короче решение такое, стукнуло в голову совершенно случайно, проверил работает…

django_rq.enqueue('libtask.task.launcher', *task, **rq_options)

Т.е. в параметре f= указывать строку того, что хотите использовать на удаленном сервере. В этом случае из окружения django проекта можно смело выбрасывать все не нужное. И таким же способом слать задания обратно, в django.
4kpt_IV
А почему-бы в RQ сразу не писать в БД?

k0st1an
Т.е. в параметре f= указывать строку того, что хотите использовать на удаленном сервере. В этом случае из окружения django проекта можно смело выбрасывать все не нужное. И таким же способом слать задания обратно, в django.

Ни черта не понятно…
k0st1an
4kpt_IV
Есть три сервера (физически разные): web, redisq, server. Надо с web отправить на server задание. если отправлять так:

django_rq.enqueue(libtask.task.launcher, *task, **rq_options)

То пакет libtask должен быть установлен на сервере с django – web. А так:

django_rq.enqueue('libtask.task.launcher', *task, **rq_options)

Можно отправить и не иметь на стороне django этого пакета. И тож самое в обратную сторону: от server -> django – тут нет зависимости от пакетов из проекта django. Redis (RedisQ) тут просто как брокер, ничего более.

У меня была ошибка, когда пытался обратно вернуть результат (server -> django), что воркер на стороне сервера не может найти апп из проекта django.

Возможно я сумбурно рассказываю. Может я чего-то не правильно строю. Не спорю, это мой первый проект. Критике восприимчив.

PS
возможно как-то можно писать отдельно код, через который можно будет писать в базу, которой пользуется django (ведь как-то дико самостоятельно писать SQL запросы к базе django…), но подобного я не знаю как сделать и чтоб это было компактно и читаемо… Ведь для этого нужна модель из django.
4kpt_IV
Где модели? Где база? На каком из серверов?
Таким образом можно было вообще послать заглушку, которая вызовет нужную функцию при вызове.
Получается Вы из одного сервера посылаете путь к пакету, которого на нем нет, но должен быть на другом сервере? Я правильно понимаю?
k0st1an
4kpt_IV
Получается Вы из одного сервера посылаете путь к пакету, которого на нем нет, но должен быть на другом сервере? Я правильно понимаю?
Верно. Там пакет точно есть. В идеале мне нужно отправить только вот это:

{'task': 12121, 'action': 'define'}

Например. А там пусть делает что хочет воркер с этим заданием. Но в RedisQ так нельзя, нужна функция которая будет это обрабатывать. Подобное можно в RabbitMQ, но его функционал для проекта избыточен.

В данном случае libtask.task.launcher это общий вход, где обрабатываются все задания любого типа.
4kpt_IV
Мне кажется RQ это не совсем то, что Вам надо. Обычную очередь и все. С одной стороны: посыл в очередь. С другой стороны: приемник - обработчик. У RQ другие задачи. А еще и с тем учетом, что на стороне сервера крутится полноценно приложение, то вообще непонятно на кой он тут.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB