我正在使用Python和弱引用来实现数据库连接池。
当线程获得连接时,将使用会话来包装它。池中将使用weakref.WeakSet
来维护会话的弱引用。
当会话没有强引用时,会话弱引用的回调函数将自动将连接返回到连接池。
class CheckOut:
def __init__(self,pool):
self.pool = pool
self.session_pool = weakref.WeakSet()
def recycle(self,connection):
self.pool.put(connection)
def add(self,session):
connection = session.connection
weakref.finalize(session,self.recycle,connection)
self.session_pool.add(session)
但是,如果我在self.pool.put(connection)
之前添加睡眠代码,例如time.sleep(1)
,则程序将阻塞,并且代码self.pool.put(connection)
将不会执行,从而导致其他线程无法获得连接