2010-02-12 10 views
17

Tengo páginas web que toman de 10 a 20 consultas de bases de datos para obtener todos los datos requeridos.¿Es posible hacer una consulta de base de datos asíncrona/paralela en una aplicación Django?

Normalmente, después de enviar una consulta, el subproceso/proceso de Django se bloquea esperando a que los resultados vuelvan, luego se reanuda la ejecución hasta que llega a la siguiente consulta.

¿Hay alguna manera de emitir todas las consultas de forma asíncrona para que puedan ser procesadas por los servidores de la base de datos en paralelo?

Estoy usando MySQL, pero también me gustaría conocer las soluciones para otras bases de datos. Por ejemplo, escuché que Postgresql tiene una biblioteca de cliente asíncrona. ¿Cómo usaría eso en este caso?

Respuesta

5

Esta entrada de blog muy reciente parece implicar que no está integrada en los frameworks django o rails. Creo que cubre bien el tema y vale la pena leerlo junto con los comentarios.

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

creo que recuerdo Cal Henderson mencionar esta deficiencia en algún lugar de su excelente discurso http://www.youtube.com/watch?v=i6Fr65PFqfk

Mi suposición ingenua es que podría ser capaz de cortar algo con bibliotecas pitón separadas pero que perdería una gran cantidad de el material de evaluación perezosa de ORM/template django da al punto que bien podría estar usando otra pila. Por otra parte, si solo está optimizando algunas vistas en un gran proyecto django, podría estar bien.

0

Pruebe Celery, hay un poco de sobrecarga de tener que ejecutar un servidor ampq, pero podría hacer lo que quiera. No estoy seguro acerca de la concurrencia del DB tho. Además, si desea velocidad para su base de datos, le recomiendo MongoDB (pero necesitará django-nonrel para eso).

+0

Ejecución de un servidor ampq no es obligatoria. Un simple memcache o redis queue funciona bien. Yo * no * personalmente recomendaría MongoDB. Aparte del hecho de que django-norel es en gran medida abandware (todavía está en 1.4. 1.4 fue EOLed en 2013, y extendió suppoort (seguridad, etc.) EOLed en 2015.), MongoDB realmente solo es más rápido si pierde cierto grado de cumplimiento de ACID por ejecutarlo como una tienda en memoria. Y en mi opinión eso es algo terrible que hacer con los datos de los clientes. – Shayne

+0

El backend redis se está debatiendo por deprecation. FYI. – DylanYoung

4

que tenía un problema similar y lo resolví con javascript/ajax

Sólo tiene que cargar la plantilla con el formato básico y luego hacer severl requsts ajax para ejecutar las consultas y cargar los datos. Incluso puedes mostrar la animación de carga. El usuario tendrá una sensación web 2.0 en lugar de una carga de página sombría. Por supuesto, esto significa varias solicitudes HTTP más por página, pero depende de usted decidir.

Así es como se ve mi ejemplo: http://artiox.lv/en/search?query=test&where_to_search=all (enlace roto)

Cuestiones relacionadas