PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Python Postgres psycopg2 ThreadedConnectionPool épuisé

J'ai eu du mal à trouver des informations vraiment détaillées sur le fonctionnement de ThreadedConnectionPool. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html n'est pas mauvais, mais il s'avère que son affirmation selon laquelle getconn bloque jusqu'à ce qu'une connexion soit disponible est incorrecte. En vérifiant le code, tout ce que ThreadedConnectionPool ajoute est un verrou autour des méthodes AbstractConnectionPool pour éviter les conditions de concurrence. Si plus de connexions maxconn sont tentées d'être utilisées à un moment donné, le pool de connexions est épuisé PoolError sera levé.

Si vous voulez quelque chose d'un peu plus simple que la réponse acceptée, envelopper davantage les méthodes dans un sémaphore fournissant le blocage jusqu'à ce qu'une connexion soit disponible devrait faire l'affaire :

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()