Uvicorn的超时分三类:timeout-keep-alive控制连接空闲超时(默认5秒),请求处理超时需靠asyncio.wait_for或Gunicorn--timeout实现,WebSocket超时则须单独配置--ws-timeout(默认60秒)。

Uvicorn 的请求超时不是靠 timeout 单一参数控制的,它分三类场景,设错就白配。
timeout 参数只管「连接空闲超时」,不是请求处理超时
很多人以为 --timeout 30 是让每个请求最多执行 30 秒,其实不是。这个 timeout 对应的是 Uvicorn 的 timeout_keep_alive,它只限制「HTTP 连接建立后、无数据收发的空闲时间」。比如客户端发起请求后突然断网,Uvicorn 会等满这个值才关连接。
- 默认值是
5秒(不是 30) - 设太高(如
60)会导致连接堆积,尤其在 Nginx 反向代理下容易触发上游超时 - 设太低(如
1)会让长轮询、SSE、慢查询接口频繁断连 - 正确用法:
uvicorn main:app --timeout-keep-alive 20
真正控制「请求处理超时」得靠 ASGI 服务器外的机制
Uvicorn 本身不中断正在运行的协程——哪怕你设了 --timeout,一个卡死的 while True 或阻塞 IO 仍会一直跑。要硬性终止请求,必须借助外部手段:
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
- 用
gunicorn包一层:通过--timeout 30(注意这是 Gunicorn 的参数)强制 kill worker 进程 - 在 FastAPI 路由里手动加
asyncio.wait_for(),例如:await asyncio.wait_for(db_query(), timeout=10) - 对 CPU 密集型任务,用
loop.run_in_executor()+timeout包裹,否则 async 也救不了 - 别依赖
fastapi.BackgroundTasks自动取消——请求超时后它默认还在跑
WebSocket 连接超时必须单独配 --ws-timeout
HTTP 超时参数对 WebSocket 完全无效。Uvicorn 提供了独立的 --ws-timeout 控制 WebSocket 连接的空闲心跳超时,单位秒:
- 默认是
60秒 - 低于客户端 ping 间隔(如前端设了 25s 心跳)就会被误断
- 生产环境建议设为客户端心跳间隔 × 2,例如:
--ws-timeout 50 - 这个参数不能写进
uvicorn_config.py,只能命令行传入
最易忽略的一点:Uvicorn 的所有超时参数都不影响已进入业务逻辑的协程生命周期,它只管连接层。真要防住慢请求,得在代码里做防御性 timeout,而不是只改启动参数。

















