Tôi đã cố gắng tìm kiếm thông tin thực sự chi tiết về cách hoạt động của ThreadedConnectionPool. https://bbengfort.github.io/observations/2017/12/06/psycopg2-transactions.html không tệ, nhưng hóa ra tuyên bố rằng getconn chặn cho đến khi có kết nối là không chính xác. Kiểm tra mã, tất cả những gì ThreadedConnectionPool thêm vào là một khóa xung quanh các phương thức AbstractConnectionPool để ngăn chặn các điều kiện chủng tộc. Nếu có nhiều hơn maxconn kết nối được cố gắng sử dụng tại bất kỳ thời điểm nào, thì nhóm kết nối đã cạn kiệt PoolError sẽ được nâng lên.
Nếu bạn muốn điều gì đó đơn giản hơn một chút so với câu trả lời được chấp nhận, thì việc gói thêm các phương thức trong Semaphore cung cấp tính năng chặn cho đến khi có kết nối sẽ thực hiện thủ thuật:
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()