2012-06-10 12 views
15

So che pymongo è thread-safe e ha un pool di connessione integrato.pymongo pooling pooling e richieste client

In un'app Web su cui sto lavorando, sto creando una nuova istanza di connessione su ogni richiesta.

La mia comprensione è che dal momento che pymongo gestisce il pool di connessioni, non è un approccio sbagliato creare una nuova connessione su ogni richiesta, poiché al termine della richiesta l'istanza di connessione sarà recuperata e sarà disponibile nelle richieste successive .

Sono corretto qui, o dovrei semplicemente creare una singola istanza da utilizzare su più richieste?

risposta

8

"L'approccio sbagliato" dipende dall'architettura dell'applicazione. Con pymongo che è un pool di connessioni thread-safe e automatico, l'uso effettivo di una singola connessione condivisa o di più connessioni sta per "funzionare". Ma i risultati dipenderanno da cosa ti aspetti che il comportamento sia. La documentazione commenta su entrambi i casi.

Se l'applicazione è in thread, dai documenti, ogni thread che accede a una connessione riceverà il proprio socket. Quindi, sia che tu crei una singola connessione condivisa, sia che ne richiedi una nuova, dipende dal fatto che le tue richieste siano o meno collegate.

Quando si utilizza gevent, è possibile avere un socket per greenlet. Questo significa che non devi avere un thread vero per richiesta. Le richieste possono essere asincrone e ottenere comunque il proprio socket.

In poche parole:

  • Se le richieste webapp sono filettate, quindi non importa in che modo si accede a una nuova connessione. Il risultato sarà lo stesso (socket per thread)
  • Se la tua webapp è async via gevent, non importa in che modo accedi a una nuova connessione. Il risultato sarà lo stesso. (socket per greenlet)
  • Se la tua webapp è asincrona, ma NON via gevent, allora devi prendere in considerazione le note sullo best suggested workflow.
Problemi correlati