Snažil jsem se najít opravdu podrobné informace o tom, jak ThreadedConnectionPool funguje. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html není špatné, ale ukázalo se, že jeho tvrzení, že getconn blokuje, dokud nebude dostupné připojení, je nesprávné. Při kontrole kódu, který ThreadedConnectionPool přidává, je zámek kolem metod AbstractConnectionPool, aby se zabránilo konfliktům. Pokud se v kterémkoli okamžiku pokusí použít více než maxconn připojení, fond připojení je vyčerpán Bude vyvolána chyba PoolError.
Pokud chcete něco trochu jednoduššího, než je přijatá odpověď, mělo by stačit další zabalení metod do semaforu poskytujícího blokování, dokud nebude dostupné připojení:
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()