2012-07-16 12 views
5

Tengo una llamada db = pymongo.Connection() en views.py de Django para una conexión MongoDB simple para almacenar algunas estadísticas simples.mejor práctica de la agrupación django + PyMongo?

¿Cuál es la mejor práctica para que sea compatible automáticamente con la agrupación de conexiones MongoDB?

¿Dónde debo poner el código end_request()?

¿Cómo elijo el parámetro max_pool_size durante la conexión?

Respuesta

7

How does connection pooling work in PyMongo?

Cada instancia de conexión se ha incorporado en la agrupación de conexiones. Por defecto, cada hilo obtiene su propio socket reservado en su primera operación. Esos sockets se mantienen hasta que end_request() es llamado por ese hilo.

Llamar end_request() permite que el socket se devuelva al grupo, y que otros subprocesos lo utilicen en lugar de crear un nuevo socket. El uso juicioso de este método es importante para aplicaciones con muchos hilos o con hilos de ejecución larga que hacen pocas llamadas a las operaciones de PyMongo .

Alternativamente, una conexión creada con auto_start_request = False será compartir sockets (de forma segura) entre todos los subprocesos.

Creo que se trata del tipo de aplicación que tiene y de cuánto tiempo las solicitudes retendrán una conexión. La idea de llamar al end_request ayuda con las solicitudes de larga ejecución que se aferran a un socket durante mucho tiempo y hace que se creen muchos sockets. Si una sola solicitud puede liberar la conexión cuando ya no la necesita, entonces el socket puede reutilizarse para otras solicitudes.

Si son solicitudes rápidas, entonces creo que el auto_start_request=False funciona reutilizando el socket.

Asegurando que una conexión sigue usando el mismo socket significa que tendrá lecturas consistentes. Piensa si hiciste una consulta pero se retrasó, y luego hiciste otra consulta inmediatamente y usó un socket diferente. Este socket logra responder antes que el anterior. Tendría datos inconsistentes ya que no refleja la escritura anterior.

+0

Hola @jdi, gracias por la respuesta, ¿puedes compartir tu consejo con el parámetro 'max_pool_size'? – est

+1

Es una forma de administrar la cantidad de conexiones que una sola conexión permitirá. Si su aplicación tiene un solo subproceso, solo consumirá 1 en el grupo. Si se trata de una aplicación con muchos subprocesos, habrá una por subproceso y es posible que desee limitar el número que permitirá en un servidor – jdi

+1

En PyMongo 3, la opción "auto_start_request" ha desaparecido. – Mithril

Cuestiones relacionadas