async def视图吞吐量未提升,主因是ASGI未真正运行或ORM仍同步阻塞:需用uvicorn启动asgi.py、改用afilter/asave等异步ORM方法、配asyncpg驱动,并调优Uvicorn参数如--workers和--http。

写了 async def 视图但吞吐量没变?大概率是 ASGI 没真跑起来,或者 ORM 查询还在同步阻塞。
确认 ASGI 服务器是否实际接管请求
开发时习惯用 python manage.py runserver,但它本质是同步 WSGI 兼容层,async def 在里面会被降级成同步执行——连事件循环都不启动。
- 必须用
uvicorn myproject.asgi:application启动(注意路径指向asgi.py,不是wsgi.py) - 检查
asgi.py是否调用了get_asgi_application(),且没被中间件包装成同步 wrapper - 启动日志里应出现
Uvicorn running on http://,而不是Starting development server - 在视图里加
import asyncio; print(asyncio.get_running_loop()),输出不能是ThreadPoolExecutor实例
数据库查询必须显式用异步 ORM 方法
Django 5.0 的异步 ORM 不是自动的:调 .filter() 还是同步阻塞;不换方法名,整个 async 视图就白写。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 用
await MyModel.objects.afilter(...)替代.filter() - 用
await obj.asave()替代obj.save() - 关联查询必须用
aprefetch_related()或aselect_related(),否则async for遍历时仍触发同步 N+1 - PostgreSQL 必须配
asyncpg驱动;SQLite 和 MySQL 官方异步驱动暂未发布(截至 2026 年 6 月)
Uvicorn 关键参数不调等于没切异步
默认只起 1 个 worker、无并发限制,高并发下请求排队严重,根本压不起来。
立即学习“Python免费学习笔记(深入)”;
-
--workers 4:设为 CPU 核心数 × 1~2,单 worker 无法利用多核 -
--http httptools:比默认h11快,WebSocket 场景必须选它 -
--limit-concurrency 1000:防突发连接耗尽内存 -
--timeout-keep-alive 5:避免和 Nginx 的 keep-alive 超时错配(尤其前置 Nginx 时)
最常被忽略的是:异步视图里混用同步 ORM + 同步第三方库(比如没做 sync_to_async 包装的 requests 调用),只要有一处阻塞,整个协程就卡住。别只盯着 async def 开头,得一路查到最底层 I/O 调用是否真正异步。

















