Jeg har kæmpet for at finde virkelig detaljerede oplysninger om, hvordan ThreadedConnectionPool fungerer. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html er ikke dårligt, men det viser sig, at dets påstand om, at getconn blokerer, indtil en forbindelse bliver tilgængelig, er forkert. Når du tjekker koden, er alt, hvad ThreadedConnectionPool tilføjer, en lås omkring AbstractConnectionPool-metoderne for at forhindre løbsforhold. Hvis der forsøges brugt mere end maxconn-forbindelser på noget tidspunkt, er forbindelsespuljen opbrugt PoolError vil blive rejst.
Hvis du vil have noget, der er lidt enklere end det accepterede svar, bør det gøre tricket at pakke metoderne ind i en Semaphore, der giver blokeringen, indtil en forbindelse bliver tilgængelig:
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()