2010-02-12 4 views
17

Ich habe Webseiten, die 10 - 20 Datenbankabfragen benötigen, um alle erforderlichen Daten zu erhalten.Ist es möglich, eine asynchrone/parallele Datenbankabfrage in einer Django-Anwendung durchzuführen?

Normalerweise wird nach dem Absenden einer Abfrage der Django-Thread/-Prozess blockiert, der darauf wartet, dass die Ergebnisse zurückkommen. Anschließend wird die Ausführung fortgesetzt, bis die nächste Abfrage erreicht wird.

Gibt es eine Möglichkeit, alle Abfragen asynchron auszuführen, damit sie von den Datenbankservern parallel verarbeitet werden können?

Ich benutze MySQL, möchte aber auch über Lösungen für andere Datenbanken erfahren. Zum Beispiel habe ich gehört, dass Postgresql eine asynchrone Client-Bibliothek hat - wie würde ich das in diesem Fall verwenden?

Antwort

5

Dieser sehr aktuelle Blogeintrag scheint zu implizieren, dass er weder im Django- noch im Rails-Framework eingebaut ist. Ich denke, es deckt das Thema gut ab und ist zusammen mit den Kommentaren eine Lektüre wert.

http://www.eflorenzano.com/blog/post/how-do-we-kick-our-synchronous-addiction/

Ich glaube, ich erinnere mich Cal Henderson diesen Mangel irgendwo in seiner ausgezeichneten Rede erwähnen http://www.youtube.com/watch?v=i6Fr65PFqfk

Meine naive Vermutung ist, Sie könnten in der Lage sein, etwas mit separaten Python-Bibliotheken zu hacken, aber sie würde viel verlieren das ORM/Template lazy evaluation stuff django gibt den Punkt, an dem man genauso gut einen anderen Stack verwenden könnte. Wenn Sie nur ein paar Ansichten in einem großen Django-Projekt optimieren, ist es vielleicht in Ordnung.

0

Versuchen Sie Celery, es gibt ein wenig Aufwand für die Ausführung eines ampq-Servers, aber es könnte tun, was Sie wollen. Nicht sicher über Nebenläufigkeit der DB tho. Auch, wenn Sie Geschwindigkeit für Ihre DB wollen, würde ich empfehlen MongoDB (aber Sie brauchen django-nonrel dafür).

+0

einen ampq Server laufen zu lassen ist nicht zwingend vorgeschrieben. Eine einfache Memcache- oder Redis-Warteschlange funktioniert einwandfrei. Ich würde MongoDB persönlich nicht empfehlen. Abgesehen von der Tatsache, dass Django-Norel weitgehend Abandonware ist (Es ist immer noch bei 1.4. 1.4 wurde 2013 EOLed, und erweiterte Supporort (Sicherheit etc) EOLed im Jahr 2015), MongoDB ist wirklich nur schneller, wenn Sie ein gewisses Maß an ACID-Compliance durch verlieren Ausführen als In-Memory-Speicher. Und meiner Meinung nach ist das eine schreckliche Sache mit Kundendaten. – Shayne

+0

Das Redis-Backend wird derzeit als veraltet behandelt. FYI. – DylanYoung

4

Ich hatte ein ähnliches Problem, und ich löste es mit Javascript/Ajax

einfach die Vorlage laden mit grundlegenden Markup und dann Ajax requsts tun severl die Abfragen auszuführen und die Daten zu laden. Sie können sogar eine Lade-Animation anzeigen. Der Benutzer wird ein Web 2.0-Gefühl haben, anstatt nur düsteres Laden von Seiten. Natürlich bedeutet dies mehrere weitere HTTP-Anfragen pro Seite, aber es liegt an Ihnen zu entscheiden.

Hier ist, wie mein Beispiel aussieht: http://artiox.lv/en/search?query=test&where_to_search=all (gebrochener Link)