2011-08-23 8 views
13

Quickie qui che ha bisogno di più competenze di dominio sul pymongo che ho in questo momento:pymongo + gevent: mi butti una banana e solo monkey_patch?

sono le parti "giuste" del driver pymongo scritto in python per me di chiamare gevent monkey_patch() e alterare con successo di blocco comportamento r pymongo/w in gevent "asincroni" greenlets?

Se questo richiederà un po 'più di lavoro sulle gambe su gevent e pymongo - ma è fattibile - sarei più che disposto a mettere il tempo finché posso ottenere un po' di orientamento su irc.

Grazie!

Nota: Su piccola scala le scritture di mongo non sono un grosso problema perché ci limitiamo ad accodare una "richiesta" di scrittura prima di sbloccarla. MA parlando a fiorix del suo twistato driver mongo astro (https://github.com/fiorix/mongo-async-python-driver), anche la scrittura veloce (richieste) di mongo può causare problemi nelle applicazioni asincroni su larga scala. (E ovviamente, le letture non bloccanti potrebbero causare problemi fin dall'inizio!)

risposta

18

Ho usato PyMongo con Gevent e qui ci sono un paio di cose che dovete guardare fuori per:

  1. un'istanza di un solo pymongo.Connection oggetto, preferibilmente come una variabile globale o a livello di modulo. Questo è importante perché lo Connection ha in sé un pool!
  2. Monkey patch tutto, o almeno ENTRAMBI socket e threading. A causa dell'uso di thread locals in Connection, il socket di patching non è sufficiente.
  3. Ricordarsi di chiamare end_request per restituire la connessione al pool.

La risposta alla tua domanda è andare avanti, PyMongo funziona perfettamente con Gevent.

+0

grazie Bernie Hackett su mongodb google group per questo aggiornamento: c'è ancora il problema che mongo ha un limite superiore sul suo pool di connessioni molto inferiore al numero di greenlet che la maggior parte delle app si genererà se stanno usando mongo nel primo posto (migliaia di greenlet). Alcune delle più recenti patch di mongodb qui https://github.com/mgood/mongo-python-driver sono nel tentativo di far sì che gevent suoni bene con il pool di thread di mongo. Ecco un altro esempio di una patch che * potrebbe * funzionare: http://code.activestate.com/recipes/577490-mongodb-pool-for-gevent-and-pymongo-packages/. – egbutter

+0

Hai o conosci qualche esempio che mostra PyMongo utilizzato con Gevent? –

+0

E qui c'è un altro esempio di una patch che potrebbe funzionare: https://gist.github.com/1184264 – kkurian

2

All'ispezione iniziale non sembra che venga eseguita alcuna operazione di socket nel codice c, quindi dovrebbe essere soddisfacente (il blocco degli op dovrebbe solo bloccare il filo verde).