Jag har kämpat för att hitta riktigt detaljerad information om hur ThreadedConnectionPool fungerar. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html är inte dåligt, men det visar sig att dess påstående att getconn blockerar tills en anslutning blir tillgänglig är felaktig. När du kontrollerar koden, allt som ThreadedConnectionPool lägger till är ett lås runt AbstractConnectionPool-metoderna för att förhindra tävlingsförhållanden. Om fler än maxconn-anslutningar försöker användas vid något tillfälle, är anslutningspoolen slut PoolError kommer att uppstå.
Om du vill ha något lite enklare än det accepterade svaret, bör det göra susen om metoderna ytterligare lindas in i en Semaphore som tillhandahåller blockeringen tills en anslutning blir tillgänglig:
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()