python блок обратного вызова weakref - PullRequest
0 голосов
/ 17 июня 2020

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

...