MST
星途 面试题库

面试题:Python自定义上下文管理器的资源复用

假设你有一个数据库连接池,需要创建一个上下文管理器来管理从连接池获取和归还连接。请用Python实现这个上下文管理器,要考虑连接获取失败的处理,以及在上下文内发生异常时如何正确归还连接并处理事务。
23.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import contextlib


class DatabaseConnectionPool:
    def __init__(self):
        self.connections = []

    def get_connection(self):
        # 模拟获取连接逻辑
        if self.connections:
            return self.connections.pop()
        else:
            raise Exception("No available connection in pool")

    def return_connection(self, conn):
        self.connections.append(conn)


@contextlib.contextmanager
def connection_manager(pool):
    try:
        conn = pool.get_connection()
        try:
            yield conn
            # 没有异常,提交事务
            conn.commit()
        except Exception as e:
            # 发生异常,回滚事务
            conn.rollback()
            raise e
        finally:
            pool.return_connection(conn)
    except Exception as e:
        # 获取连接失败处理
        print(f"Failed to get connection: {e}")


# 示例使用
pool = DatabaseConnectionPool()
with connection_manager(pool) as conn:
    # 使用conn进行数据库操作
    pass