asyncpg在高并发简单查询场景下qps通常是aiopg的2–3倍,因asyncpg直接实现postgresql二进制协议,而aiopg仅为psycopg2的异步封装,需经同步协议层。

asyncpg 与 aiopg 的吞吐量实测差异
asyncpg 在高并发简单查询场景下,QPS 通常是 aiopg 的 2–3 倍。这不是理论值,而是用 ab 或 toolbench 在相同硬件、相同 PostgreSQL 实例、相同连接池配置(min_size=10, max_size=50)下跑出来的稳定结果。
根本原因在于 aiopg 是对 psycopg2 的 asyncio 封装,仍需经过 psycopg2 的同步协议层;而 asyncpg 直接实现 PostgreSQL 二进制协议,跳过了文本解析和中间转换开销。
- 测试时务必关闭连接池的自动重连逻辑(
min_size == max_size),否则重连抖动会污染延迟数据 - 避免在测试中混用事务——
BEGIN; SELECT; COMMIT这类操作会让 aiopg 的锁竞争更明显 - asyncpg 的
fetch()比fetchrow()多一次序列化,压测时统一用fetchrow()才公平
连接池参数对 P99 延迟的实际影响
默认的 min_size=10, max_size=10 在并发 200+ 时会立刻暴露问题:P99 延迟从 15ms 跳到 200ms+,不是数据库慢了,是新请求在等空闲连接。
asyncpg 的连接池扩容是非阻塞的,但建立新连接本身要走 TCP 握手 + SSL 协商 + PostgreSQL 认证,这个过程在协程里仍是耗时操作(约 50–150ms)。如果 max_size 设得太小,大量请求就会卡在 pool.acquire() 上。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 生产环境建议按
max_size = min(100, cpu_count * 10)起步,再根据pool.get_idle_connection_count()监控调整 - 不要依赖
min_size预热——asyncpg 不保证启动时就建满 min_size 个连接,得靠首次请求触发 - 连接泄漏比连接不足更危险:一个未
await pool.release(conn)的异常路径,会让连接永远滞留在池中
aiomysql 和 asyncpg 的基准测试不能直接比
拿 aiomysql 对标 asyncpg 的 QPS 数值没有意义。两者底层协议完全不同:MySQL 使用文本协议 + 自定义握手流程,PostgreSQL 使用二进制协议 + SASL 认证。它们的网络往返次数、单次响应体积、类型编解码成本都不在一个量级。
真正该比的是「单位资源下的业务吞吐」:比如每秒处理多少笔订单(含 INSERT + SELECT + UPDATE),而不是单纯跑 SELECT 1。
- 测试必须包含真实字段类型(
jsonb,timestamp with time zone,numeric),这些类型在 asyncpg 里有专用 codec,在 aiomysql 里常退化为字符串解析 - 批量写入场景下,asyncpg 的
executemany()比 aiomysql 的executemany()快得多,因为前者支持二进制 COPY 协议 - 别信“同样 100 并发下谁更快”——先确认你的应用实际并发峰值是多少,再按那个数字去调参
性能数据容易被忽略的三个上下文
所有公开的 benchmark 报告都省略了关键约束条件:PostgreSQL 版本、客户端所在机器的 CPU 核心数、是否启用 jit、shared_buffers 设置、甚至驱动安装方式(pip install asyncpg vs pip install asyncpg[uvloop])。
比如 uvloop 加速对 asyncpg 有效,但对 aiopg 几乎无感,因为瓶颈不在事件循环,而在 psycopg2 的 C 层阻塞调用。
- 本地开发机跑出的 5000 QPS,在云服务器上可能只有 800 QPS——网卡、磁盘 I/O、TCP buffer 都不同
- asyncpg 的
prepare缓存默认只存 100 条,高频动态 SQL 场景下缓存命中率暴跌,这时要手动调大statement_cache_size - Python 3.12 的
asyncio调度器改进对 aiopg 无效,但它让 asyncpg 的连接复用延迟降低了约 12%
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










