sql >> Base de Datos >  >> RDS >> PostgreSQL

Python Postgres psycopg2 ThreadedConnectionPool agotado

He tenido problemas para encontrar información realmente detallada sobre cómo funciona ThreadedConnectionPool. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html no está mal, pero resulta que su afirmación de que getconn bloquea hasta que una conexión esté disponible es incorrecta. Al verificar el código, todo lo que ThreadedConnectionPool agrega es un bloqueo alrededor de los métodos AbstractConnectionPool para evitar condiciones de carrera. Si se intenta utilizar más conexiones que maxconn en algún momento, el grupo de conexiones se agota Se generará PoolError.

Si desea algo un poco más simple que la respuesta aceptada, envolver aún más los métodos en un semáforo que proporcione el bloqueo hasta que una conexión esté disponible debería funcionar:

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