2012-09-29 11 views
14

Lo stato di psycopg dichiara: "Le connessioni Psycopg non sono thread verdi sicuri e non possono essere utilizzate contemporaneamente da thread verdi diversi. Provare a eseguire più di un comando alla volta utilizzando un cursore per thread causerà un errore (o un deadlock sulle versioni precedenti alla 2.4.2). Pertanto, si consiglia ai programmatori di evitare la condivisione delle connessioni tra le coroutine o di utilizzare un blocco di tipo libreria per sincronizzare le connessioni condivise, ad esempio per il pooling. "Come posso unire le connessioni usando psycopg e gevent?

Non riesco a trovare un'implementazione di pool che sia sicuro per il thread verde: ce ne sono alcuni là fuori?

risposta

12

presumo si sa gevent-psycopg2 modulo, il che rende psycopg greenlet-friendly.

in cerca di soluzione il pool di connessioni Ho provato 2 soluzioni:

  • SQLALchemy - sembra funzionare correttamente con le discussioni scimmia-patched e gevent-psycopg2. La classe QueuePool utilizza internamente il modulo threading per il blocco, pertanto è necessario applicare patch di scimmia, anche se gevent-psycopg2 fa il numero verde psycopg2.

  • c'è un psycopg2connection pooling example in gevent esempi

ho provato entrambe le soluzioni, ma non a carico di produzione - quindi non posso dire sulla loro robustezza ancora.

+0

Terminato utilizzando l'esempio del pool di connessioni nei documenti gevent – gone

+1

Link aggiornato all'esempio gevent di psycopg2: https://github.com/gevent/gevent/blob/master/examples/psycopg2_pool.py –

+0

Grazie, ho appena aggiornato la risposta. Aggiornamento –

0

Ecco una bella piscina (non solo esempio, ma usato in produzione): psycopg2_pool.py

+0

è possibile utilizzarlo con SQLAlchemy? – Stephan

Problemi correlati