2016-06-11 2 views
0

Есть ли способ вызвать save() на модели в django, не дожидаясь ответа от db?
Вы могли бы рассмотреть эту асинхронность, хотя мне нужно меньше, поскольку вызовы асинхронного вызова обычно дают вам обратный вызов, который мне не нужен здесь.
Поэтому в основном я хочу -Джанго неблокирующее сохранение?

SomeModel.objects.bulk_create([list of objects ]), каждый говорят 1000 объектов,
Без этой строки блокирующей мой код. Я не буду использовать эти строки в моем коде.
Я ищу что-то простое, как пакет сельдерея, кажется, предлагает намного больше, чем это ..

+1

Сравнение сельдерея с django - сравнение яблок и апельсинов. Django предназначен для обеспечения того, чтобы все данные были сохранены должным образом или чтобы исключить исключение, если это невозможно. Вы эссенциально превращаете джанго в его голову. Однако вы все равно можете передать эту работу сельдерею и покончить с этим. – e4c5

+0

Дело в том, что мне нужно записать некоторые данные для каждого посещения в этом представлении, и я не хочу, чтобы он был медленным из-за этой вставки. Сельдерей просто кажется слишком сложным со слишком большим количеством зависимостей для такой простой задачи. – user3599803

ответ

2

По состоянию на 2016 год, Django является веб-фреймворк работает (на данный момент, если мы игнорируем channels) принимает HTTP запрос «как аргумент» и как можно скорее возвращает HTTP-ответ.

Эта архитектура означает, что в рамках концепции нет асинхронной работы. Если вы хотите отложить сохранение и вернуть ответ пользователю без ожидания, вы можете:

  • либо запустить другой поток/блок асинхронного ввода (что может быть утомительным с транзакциями базы данных ...);
  • услуги, такие как IronWorker, позволяющие запускать очереди для запуска async a.s.a.p;
  • celery, что может принести слишком много возможностей для вашего дела, но будет лучше, чем работать, чем какое-нибудь домашнее решение.
+0

Слишком плохо. Я помню, где-то читал, что у других dbs, таких как mongoDB, есть опция «вставить и продолжить». Поэтому я могу использовать его только для этого. – user3599803

0

rq (Redis Queue) - еще один вариант для асинхронных операций (кроме тех, которые Максим Лорант упоминает в своем ответе). Он использует Redis в качестве брокера (средний человек, который выполняет задачи), поэтому, если вы уже используете Redis или хотите добавить его в свой проект, вы должны его рассмотреть. Это приятное и простое решение, намного проще, чем сельдерей. Существует также django-rq простое приложение, которое обеспечивает интеграцию django для rq.

Update: Итоговые комментарии

django_rq предоставляет команды управления (rqworker), который запускает рабочий процесс. Любое задание, которое помещается в очередь, будет выполняться этим процессом. Вы можете отправить одно задание в очередь для каждого объекта (задание будет функцией с объектом в его аргументах, и оно сохранит объект в базе данных) или соберите список объектов и отправьте задание с этим списком. Во втором случае вам нужно временно хранить этот список где-нибудь, что может быть сложно.

Использование Redis для временного хранения объектов (рекомендуется)

Я думаю, что самый надежный способ сделать это, чтобы сериализовать объекты JSON и хранить их в список Redis. Затем регулярно проверяйте длину и длину требуемой длины, вы можете отправить задание в очередь, имеющую этот список в своих аргументах.

Использование памяти работника для временного хранения объектов

Вы также можете использовать оперативную память вашего работника в качестве временного хранилища. Это можно сделать, поскольку рабочий процесс имеет свою собственную память. В этом случае основной процесс (рабочий сервер) создает задание с объектом. Задание не сохраняет объект, оно просто добавляет его в список.Вы можете сохранить добавление объектов в этот список. Поскольку задания выполняются в рабочем процессе, этот список существует в памяти рабочего. Когда он имеет желаемую длину, вы можете сохранить все объекты.

Но представьте себе случай, когда вы создаете более одного рабочего. В этом случае каждое задание в очереди будет выбрано текущим свободным работником. Таким образом, некоторые объекты будут добавлены в список в памяти рабочего_1, некоторые другие объекты в списке worker_2 и т. Д., И вам придется иметь дело с таким количеством списков, что и рабочие.

+0

А как насчет команды управления django custom? Не удалось понять, как получить доступ к уже запущенному – user3599803

+0

Что вы имеете в виду? Можете ли вы дать более подробное объяснение? – dimyG

+0

Выполнение команды django https://docs.djangoproject.com/en/1.10/howto/custom-management-commands/, которая будет работать в фоновом режиме и будет делать записи в db – user3599803

Смежные вопросы