मैंने थ्रेडेडकनेक्शनपूल कैसे काम करता है, इस बारे में वास्तव में विस्तृत जानकारी प्राप्त करने के लिए संघर्ष किया है। https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html खराब नहीं है, लेकिन यह पता चला है कि कनेक्शन उपलब्ध होने तक getconn ब्लॉक करने का उसका दावा गलत है। कोड की जाँच करते हुए, सभी ThreadedConnectionPool जोड़ता है, दौड़ की स्थिति को रोकने के लिए AbstractConnectionPool विधियों के आसपास एक लॉक है। यदि किसी भी बिंदु पर मैक्सकॉन से अधिक कनेक्शन का उपयोग करने का प्रयास किया जाता है, तो कनेक्शन पूल समाप्त हो जाता है 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()