You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TestClient测试FastAPI+asyncpg应用二次请求报错排查

问题原因解析

核心根源:事件循环的生命周期管理问题

你遇到的问题本质是TestClient非上下文模式下未正确维护异步事件循环的生命周期,结合asyncpg对事件循环的强依赖导致:

  • 非上下文管理器模式的缺陷:
    直接初始化TestClient(不用with语句)时,第一次请求会创建并绑定一个异步事件循环,但请求结束后,TestClient不会自动执行清理逻辑——包括关闭事件循环、销毁asyncpg连接池等资源。第二次请求时,TestClient尝试复用已关闭的事件循环,而asyncpg的连接池是绑定到原事件循环的,此时连接池已不可用,底层抛出Event loop is closed异常,上层被包装为cannot perform operation: another operation is in progress错误。

  • 上下文管理器模式的修复逻辑:
    使用with TestClient(app) as client时,with语句会自动触发TestClient的__enter__和__exit__方法:

    • __enter__:确保创建/获取活跃的异步事件循环,初始化asyncpg连接池;
    • __exit__:请求结束后,主动关闭asyncpg连接池、终止事件循环并清理所有关联资源。
      每次进入上下文都会有全新的活跃事件循环环境,第二次请求自然能正常执行。

curl测试正常的原因

curl作为外部HTTP客户端,每次请求都是独立的HTTP调用——你的FastAPI应用运行在服务器(如uvicorn)时,服务器会持续维护一个活跃的异步事件循环,所有请求都在这个循环中处理,不存在循环被关闭的情况,因此多次请求都能正常工作。

内容的提问来源于stack exchange,提问作者persson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:27:04