Ich habe mich bemüht, wirklich detaillierte Informationen darüber zu finden, wie der ThreadedConnectionPool funktioniert. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html ist nicht schlecht, aber es stellt sich heraus, dass die Behauptung, dass getconn blockiert, bis eine Verbindung verfügbar wird, falsch ist. Wenn Sie den Code überprüfen, ist alles, was ThreadedConnectionPool hinzufügt, eine Sperre um die AbstractConnectionPool-Methoden, um Racebedingungen zu verhindern. Wenn zu irgendeinem Zeitpunkt versucht wird, mehr als maxconn-Verbindungen zu verwenden, ist der Verbindungspool erschöpft PoolError wird ausgelöst.
Wenn Sie etwas Einfacheres als die akzeptierte Antwort wollen, sollten Sie die Methoden weiter in ein Semaphor packen, das die Blockierung bereitstellt, bis eine Verbindung verfügbar wird:
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()