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()