aiopg中async with engine.acquire()是否会自动关闭连接?
关于async engine.acquire()上下文管理器的连接回收行为
问题复现代码
async with engine.acquire() as conn: await conn.execute(...)
解答
该上下文管理器不会在退出代码块时直接关闭对应PostgreSQL的物理连接,具体行为规则如下:
- 进入
async with块时,程序会从engine实例维护的连接池中取出一个空闲的PostgreSQL物理连接,绑定到conn变量供业务逻辑使用 - 退出
async with块时(无论代码正常执行完成还是中途抛出异常),上下文管理器会自动触发连接回收逻辑,默认是将连接放回连接池供后续请求复用,而非直接销毁物理连接 - 只有以下场景才会真正关闭对应的PostgreSQL物理连接:
- 显式调用
await engine.dispose()销毁整个连接池 - 连接超过了连接池预先配置的最大空闲时长,被自动清理
- 连接在使用过程中出现网络断开、协议错误等不可恢复的异常,被判定为无效连接后销毁
- 显式调用
如果是特殊业务场景需要每次使用完就立即关闭物理连接,可以在async with块内部最后显式调用await conn.close(),但绝大多数业务场景下复用连接池的连接性能远高于频繁新建/销毁连接,不建议主动关闭正常可用的连接。
内容的提问来源于stack exchange,提问作者mr_bulrathi
相关产品推荐
相关产品推荐

