Борих се да намеря наистина подробна информация за това как работи ThreadedConnectionPool. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html не е лошо, но се оказва, че твърдението му, че getconn блокира, докато връзката стане достъпна, е неправилно. Проверката на кода, всички добавяни ThreadedConnectionPool е заключване около методите AbstractConnectionPool за предотвратяване на условия на състезание. Ако в даден момент се опитат да се използват повече от maxconn връзки, пулът за връзки е изчерпан PoolError ще бъде повдигнат.
Ако искате нещо малко по-просто от приетия отговор, по-нататъшното обвиване на методите в семафор, осигуряващо блокирането, докато връзката стане налична, трябва да свърши работа:
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()