Кто-нибудь делает асинхронные коммиты БД? - PullRequest
2 голосов
/ 13 декабря 2011

Большая часть самой длинной (самой трудоемкой) логики, с которой я столкнулся, в основном состоит из двух вещей: отправка электронной почты и фиксация элементов в базе данных.

Существует ли какой-либо встроенный механизм для асинхронного выполнения этих действий, чтобы не замедлять загрузку страницы?

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

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

pv = PageView.objects.get(page = request.path)
pv.views = pv.views + 1
pv.save() # SLOWWWWWWWWWWWWWW

Естественно ли думать, что я должен ускорить это, сделав весь процесс асинхронным?

Ответы [ 4 ]

5 голосов
/ 13 декабря 2011

Взгляните на Сельдерей .Он позволяет асинхронным рабочим выполнять задачи точно так же, как вы спрашиваете: отправка электронной почты, подсчет просмотров страниц и т. Д. Изначально он был разработан для работы только с Django, но теперь работает и в других средах.

0 голосов
/ 28 ноября 2014

Вы можете иметь Python ThreadPool и назначать записи в базу данных. Хотя GIL не позволяет потокам Python работать одновременно, это позволяет продолжить поток ответов до завершения записи.

Я использую эту технику, когда результат записи не важен для отображения ответа.

Конечно, если вы хотите отправить запрос и хотите вернуть 201, это не божья практика.

0 голосов
/ 02 марта 2012

Я использую этот шаблон для обновления текстового индекса (что медленно), так как это можно сделать в фоновом режиме. Таким образом, пользователь видит быстрое время отклика:

    # create empty file
    dir=os.path.join(settings.DT.HOME, 'var', 'belege-changed')
    file=os.path.join(dir, str(self.id))
    fd=open(file, 'a') # like "touch" shell command
    fd.close()

Cron-job сканирует этот каталог каждые N минут и обновляет текстовый индекс.

В вашем случае я бы написал request.path в файл и обновил модель PageView в фоновом режиме. Это повысит производительность, поскольку вам не нужно обращаться к базе данных для каждого оператора приращения.

0 голосов
/ 13 декабря 2011

http://www.mongodb.org/ может сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...