Возможно ли выполнить асинхронный/параллельный запрос базы данных в приложении Django?
У меня есть веб-страницы, которые принимают 10-20 запросов к базе данных, чтобы получить все необходимые данные.
Обычно после отправки запроса поток/процесс Django блокируется, ожидая возвращения результатов, затем он возобновляет выполнение, пока не достигнет следующего запроса.
Можно ли асинхронно выдать все запросы, чтобы они могли обрабатываться сервером базы данных параллельно?
Я использую MySQL, но хотел бы услышать о решениях для других баз данных. Например, я слышал, что Postgresql имеет асинхронную клиентскую библиотеку - как я буду использовать это в этом случае?
Ответы
Ответ 1
Эта очень недавняя запись в блоге, по-видимому, подразумевает, что она не встроена в рамки django или rails. Я думаю, что он хорошо освещает проблему и вполне заслуживает внимания вместе с комментариями.
http://www.eflorenzano.com/blog/post/how-do-we-kick-our-synchronous-addiction/
Я думаю, что я помню, как Кэл Хендерсон упоминал этот недостаток где-то в его прекрасной речи http://www.youtube.com/watch?v=i6Fr65PFqfk
Моя наивная догадка заключается в том, что вы можете взломать что-то с отдельными библиотеками python, но вы потеряете много ленивых оценочных материалов ORM/шаблона, которые django дает, чтобы вы могли использовать другой стек. Опять же, если вы только оптимизируете несколько просмотров в большом проекте django, это может быть хорошо.
Ответ 2
У меня была аналогичная проблема, и я решил ее с помощью javascript/ajax
Просто загрузите шаблон с базовой разметкой, а затем выполните severl ajax requsts для выполнения запросов и загрузки данных. Вы даже можете показать анимацию загрузки. У пользователя будет ощущение web 2.0, а не просто мрачная загрузка страницы. Конечно, это означает еще несколько HTTP-запросов на страницу, но вам решать.
Вот как выглядит мой пример: http://artiox.lv/en/search?query=test&where_to_search=all (неработающая ссылка)
Ответ 3
Попробуйте Celery, немного накладных расходов на запуск сервера ampq
, но он может делать то, что вы хотите, Не уверен о concurrency БД. Кроме того, если вы хотите скорость для своей БД, я бы рекомендовал MongoDB (но для этого вам понадобится django-nonrel
).