Можно ли сделать асинхронный / параллельный запрос к базе данных в приложении Django? - PullRequest
17 голосов
/ 12 февраля 2010

У меня есть веб-страницы, которые принимают 10 - 20 запросов к базе данных, чтобы получить все необходимые данные.

Обычно после отправки запроса поток / процесс Django блокируется, ожидая возвращения результатов, затем возобновляет выполнение до достижения следующего запроса.

Есть ли способ выполнить все запросы асинхронно, чтобы они могли обрабатываться сервером (-ами) базы данных параллельно?

Я использую MySQL, но хотел бы услышать и о решениях для других баз данных. Например, я слышал, что Postgresql имеет асинхронную клиентскую библиотеку - как бы я использовал это в этом случае?

Ответы [ 3 ]

5 голосов
/ 12 февраля 2010

Эта недавняя запись в блоге, похоже, подразумевает, что она не встроена ни в фреймворки 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, это может быть хорошо.

4 голосов
/ 19 апреля 2011

У меня была похожая проблема, и я решил ее с помощью javascript / ajax

Просто загрузите шаблон с базовой разметкой, а затем выполните severl ajax requsts для выполнения запросов и загрузки данных. Вы даже можете показать анимацию загрузки. У пользователя будет чувство web 2.0 вместо просто мрачной загрузки страницы. Конечно, это означает еще несколько HTTP-запросов на страницу, но вам решать.

Вот как выглядит мой пример: http://artiox.lv/en/search?query=test&where_to_search=all (неработающая ссылка)

0 голосов
/ 19 апреля 2011

Попробуйте Celery , есть некоторые издержки при запуске сервера ampq, но он может делать то, что вы хотите.Не уверен насчет параллелизма БД, хотя.Кроме того, если вам нужна скорость для вашей БД, я бы порекомендовал MongoDB (но для этого вам потребуется django-nonrel).

...