2011-08-23 8 views
13

algo rápido aquí que necesita más experiencia en el campo de pymongo de lo que tengo en este momento:pymongo + gevent: ¿lanzarme una banana y solo monkey_patch?

son las partes "correctas" del conductor pymongo escrito en Python para que llame a GEvent monkey_patch() y alterar con éxito bloqueando el comportamiento de r pymongo/w dentro de gevent "asynchronous" greenlets?

Si esto requerirá un poco más de trabajo sobre gevent y pymongo, pero es factible, estaré más que dispuesto a dedicarle tiempo mientras pueda obtener un poco de guía sobre irc.

Gracias!

Nota: a pequeña escala, las escrituras de mongo no son un gran problema porque solo estamos haciendo una "solicitud" de escritura antes de desbloquear. PERO hablando con fiorix sobre su controlador de mongo asincrónico retorcido (https://github.com/fiorix/mongo-async-python-driver), incluso la escritura rápida (solicitudes) de mongo puede causar problemas en aplicaciones asíncronas a escala. (¡Y por supuesto, las lecturas sin bloqueo podrían causar problemas desde el principio!)

Respuesta

18

he utilizado PyMongo con GEvent y aquí están algunas cosas que hay que tener en cuenta:

  1. Instantiate único pymongo.Connection objeto, preferiblemente como una variable global o de nivel de módulo. ¡Esto es importante porque Connection tiene dentro de sí mismo un grupo!
  2. Monkey patch todo, o al menos AMBOS zócalo y rosca. Debido al uso de locales de hilo en Connection, el zócalo de parcheado por sí solo no es suficiente.
  3. Recuerde llamar al end_request para devolver la conexión al grupo.

La respuesta a su pregunta es: PyMongo funciona bien con Gevent.

+0

gracias Bernie Hackett en mongodb grupo de google para esta actualización: todavía hay el problema de que mongo tiene un límite superior en su grupo de conexión mucho menor que el número de greenlets que la mayoría de las aplicaciones generará si están usando mongo en el primer lugar (1000 de greenlets). Algunos de los últimos parches de mongodb aquí https://github.com/mgood/mongo-python-driver están en un intento de hacer que gevent juegue muy bien con la agrupación de subprocesos de mongo. Aquí hay otro ejemplo de un parche que * podría * funcionar: http://code.activestate.com/recipes/577490-mongodb-pool-for-gevent-and-pymongo-packages/. – egbutter

+0

¿Tiene, o conoce, algún ejemplo que demuestre que PyMongo se está utilizando con Gevent? –

+0

Y aquí hay otro ejemplo de un parche que podría funcionar: https://gist.github.com/1184264 – kkurian

2

En la inspección inicial no parece que se realicen operaciones de socket en el código c, así que debería estar bien (las operaciones de bloqueo solo deberían bloquear el hilo verde).