Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 1, 2016 14:29:25

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

django, worker, models

Доброго дня. Никак не могу сообразить как писать в базу (через модель) полученные данные после работы воркера. Схема такая. Использую django-rq. Через форму получаю данные от пользователя, и отправляю в очередь. Где-то там воркер отдаёт либе данные пользователя, либа эти данные переваривает, делает что нужно и отдает результаты.


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


Можно даже результат в другую очередь кидать. Воркет будет слушать и писать в базу эти результаты. Но я не могу понять как получить доступ к модели. Именно связка django ORM + воркер не понятно как реализовать. Может примером ударите?… Может я конечно не очень понимаю как строятся подобные приложения. Опыта в подобных аппах нет..



—-
memento mori

Офлайн

#2 Фев. 1, 2016 14:32:24

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

django, worker, models

Используйте кастомные команды. 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)

Офлайн

#3 Фев. 1, 2016 15:13:12

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

django, worker, models

ayb
Про кастомные команды более менее понятно. Геморройно, надо тестить. Я так понял именно через этот способ нужно поднимать воркер, слушать очередь и принимать данные… Там, кстати, уже есть rqworker и rqscheduler. Надо их глянуть..



—-
memento mori

Офлайн

#4 Фев. 1, 2016 19:49:19

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

django, worker, models

Не, что-то всё не то. Постоянно какие-то велосипеды. И что самое неприятное так это то, что и на сайте и на удалённом сервере нужно держать либу которой хочешь воспользоваться. Я подумал об API. Но сейчас я подобное не потяну. Хотя API при использовании JSON подходит идеально. Не нужно ничего держать на сайте (лишних бибилиотек) и на удалённой машине.



—-
memento mori

Офлайн

#5 Фев. 10, 2016 08:56:12

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

django, worker, models

Пока занимался JS, подумал о другом способе. Короче решение такое, стукнуло в голову совершенно случайно, проверил работает…

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

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



—-
memento mori

Офлайн

#6 Фев. 10, 2016 11:11:43

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

django, worker, models

А почему-бы в RQ сразу не писать в БД?

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

Ни черта не понятно…

Офлайн

#7 Фев. 10, 2016 11:30:42

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

django, worker, models

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.



—-
memento mori

Офлайн

#8 Фев. 10, 2016 11:46:33

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

django, worker, models

Где модели? Где база? На каком из серверов?
Таким образом можно было вообще послать заглушку, которая вызовет нужную функцию при вызове.
Получается Вы из одного сервера посылаете путь к пакету, которого на нем нет, но должен быть на другом сервере? Я правильно понимаю?

Офлайн

#9 Фев. 10, 2016 11:53:14

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

django, worker, models

4kpt_IV
Получается Вы из одного сервера посылаете путь к пакету, которого на нем нет, но должен быть на другом сервере? Я правильно понимаю?
Верно. Там пакет точно есть. В идеале мне нужно отправить только вот это:

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

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

В данном случае libtask.task.launcher это общий вход, где обрабатываются все задания любого типа.



—-
memento mori

Офлайн

#10 Фев. 10, 2016 12:02:34

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

django, worker, models

Мне кажется RQ это не совсем то, что Вам надо. Обычную очередь и все. С одной стороны: посыл в очередь. С другой стороны: приемник - обработчик. У RQ другие задачи. А еще и с тем учетом, что на стороне сервера крутится полноценно приложение, то вообще непонятно на кой он тут.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version