PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Python Postgres psycopg2 ThreadedConnectionPool esaurito

Ho faticato a trovare informazioni davvero dettagliate su come funziona ThreadedConnectionPool. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html non è male, ma si scopre che la sua affermazione che getconn si blocca fino a quando una connessione non diventa disponibile non è corretta. Controllando il codice, tutto ciò che ThreadedConnectionPool aggiunge è un blocco attorno ai metodi AbstractConnectionPool per prevenire condizioni di competizione. Se si tenta di utilizzare più di maxconn connessioni in qualsiasi momento, il pool di connessioni esaurito Verrà sollevato PoolError.

Se vuoi qualcosa di un po' più semplice della risposta accettata, avvolgere ulteriormente i metodi in un semaforo fornendo il blocco fino a quando non diventa disponibile una connessione dovrebbe fare il trucco:

from psycopg2.pool import ThreadedConnectionPool
from threading import Semaphore

class ReallyThreadedConnectionPool(ThreadedConnectionPool):
    def __init__(self, minconn, maxconn, *args, **kwargs):
        self._semaphore = Semaphore(maxconn)
        super().__init__(minconn, maxconn, *args, **kwargs)

    def getconn(self, *args, **kwargs):
        self._semaphore.acquire()
        return super().getconn(*args, **kwargs)

    def putconn(self, *args, **kwargs):
        super().putconn(*args, **kwargs)
        self._semaphore.release()