Я использую 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)
не будет выполняться, в результате чего другие потоки не получат соединение.