Snowflake&Sqlalchemy连接已关闭,但线程仍然挂起

问题描述 投票:0回答:1

我写了一个雪花和sqlalchemy包装器来建立到雪花数据仓库的一次性连接,以后可以使用该连接执行多个查询。代码如下:

class SnowFlakeConnection:

    def __init__(self):
        self.engine = create_engine(URL("XXXXX"))
        self.connection = self.engine.connect()               

    def get_df_from_query (self, query):
        '''
        Params: Runs the supplied query
        Return: DataFrame that contains the query Results
        '''
        df = pd.DataFrame()
        df = pd.read_sql(query, self.connection)
        df.columns = [x.upper() for x in (df.columns)]

        return df

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, tb):
        self.connection.close()
        self.engine.dispose()

    def __del__(self):
        self.connection.close()
        self.engine.dispose()

然后,我编写了一个简单的程序,称为SnowFlakeConnection模块。


if __name__ == "__main__":

    with SnowFlakeConnection() as snowflake_connection:
        snowflake_connection = SnowFlakeConnection()

        ## Making a sample connection
        query = 'SELECT * FROM DB'
        df_res = snowflake_connection.get_df_from_query(query)
        print (df_res)

但是,尽管我可以在末尾正确启动df_res,但我的主要功能从未终止。它只是挂在那里而没有退出。经过一番调查,我发现我在初始化期间通过调用self.engine.connect()创建了一个新线程。但是,在__exit___功能中,我显然已经关闭了连接并配置了引擎。另外,我编写的析构函数执行相同的工作以关闭连接并配置引擎。为什么线程仍然在那里?当我正确处置了我创建的引擎时,为什么程序没有终止?

先谢谢您。

python-3.x multithreading sqlalchemy database-connection snowflake-data-warehouse
1个回答
0
投票

[在所有事务完成后,尝试处置连接池:

self.engine.dispose()

在您的代码中。有关更多详细信息,请参见documentation

© www.soinside.com 2019 - 2024. All rights reserved.