Saya telah berjuang untuk menemukan informasi yang sangat rinci tentang cara kerja ThreadedConnectionPool. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html tidak buruk, tetapi ternyata klaimnya bahwa getconn memblokir hingga koneksi tersedia tidak benar. Memeriksa kode, semua yang ditambahkan ThreadedConnectionPool adalah kunci di sekitar metode AbstractConnectionPool untuk mencegah kondisi balapan. Jika lebih dari koneksi maxconn dicoba digunakan pada titik mana pun, kumpulan koneksi habis PoolError akan dimunculkan.
Jika Anda menginginkan sesuatu yang sedikit lebih sederhana daripada jawaban yang diterima, lebih lanjut membungkus metode dalam Semaphore yang menyediakan pemblokiran hingga koneksi tersedia harus melakukan trik:
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()