Ik heb moeite om echt gedetailleerde informatie te vinden over hoe de ThreadedConnectionPool werkt. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html is niet slecht, maar het blijkt dat de bewering dat getconn blokkeert totdat er een verbinding beschikbaar is, onjuist is. Door de code te controleren, voegt ThreadedConnectionPool alleen een slot toe rond de AbstractConnectionPool-methoden om race-omstandigheden te voorkomen. Als er op enig moment meer dan maxconn-verbindingen worden geprobeerd, is de verbindingspool uitgeput PoolError wordt opgeworpen.
Als je iets eenvoudiger wilt dan het geaccepteerde antwoord, zou het voldoende moeten zijn om de methoden verder te verpakken in een semafoor die de blokkering biedt totdat er een verbinding beschikbaar komt:
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()