Curio:一个已完成使命的 Python 异步库
Curio:一个已完成使命的 Python 异步库
Curio 是 David Beazley 开发的 Python 异步编程库,累计获得 4127 个 Star。


这个项目基于协程和 async/await 语法构建,为 Python 并发系统编程提供任务、套接字、文件、锁和队列等编程抽象。2025 年 12 月 21 日,Beazley 发布终止声明,宣布项目停止维护,十年的开发周期画上句号。
Curio 的最初目标是教育和探索。作者在 2015 至 2019 年间围绕该项目进行了多次 PyCon 演讲,主题涵盖 Python 并发原理、异步编程的构建方式等。这些演讲视频至今仍在传播。
该库的设计核心是严格分离异步环境与同步环境。Python 异步代码的常见问题,在于异步与同步功能混杂在同一环境中,造成 API 混乱。Curio 的解决方案是:所有异步相关功能一律使用 async/await 实现,异步与同步代码的交互仅通过事件和队列等少量简单机制完成。
这种隔离带来了两个结果:一是代码量小,二是心智负担低。用户不需要在大量混合 API 中辨别哪些是异步的、哪些是同步的。
Curio 从零实现,不基于 asyncio,也不追求与其他异步库的兼容。它支持结构化并发、任务取消、超时控制、任务组监控等功能,可在 Unix 和 Windows 平台运行,没有外部依赖。
Curio 的 API 设计与 asyncio 有显著重叠,但接口并不相同。作者明确表示兼容性不是目标,项目的重点是探索基于环境分离的软件架构理念。其他异步库大多忽略了这一概念,只是在 asyncio 的基础上提供变体。
以下是一个 TCP 回显服务器的实现:
from curio import run, spawn
from curio.socket import *
async def echo_server(address):
sock = socket(AF_INET, SOCK_STREAM)
sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
sock.bind(address)
sock.listen(5)
print('Server listening at', address)
async with sock:
while True:
client, addr = await sock.accept()
await spawn(echo_client, client, addr, daemon=True)
async def echo_client(client, addr):
print('Connection from', addr)
async with client:
while True:
data = await client.recv(100000)
if not data:
break
await client.sendall(data)
print('Connection closed')
if __name__ == '__main__':
run(echo_server, ('',25000))
这段代码的写法与传统线程模型几乎一致,内部未使用线程即可处理数千个并发客户端。
在同步原语方面,Curio 支持事件、锁、递归锁、信号量、条件变量、队列、子进程,以及在线程和进程中运行任务的能力。其任务模型完整实现了取消、超时和监控机制,这些对编写可靠的并发代码至关重要。
性能方面,作者在 macOS 上使用 Python 3.9 进行过简单回显服务器的基准测试。结果显示 Curio 的速度超过 asyncio 和 trio 同等实现的两倍以上。作者同时提醒,单一基准测试结果不能代表整体应用性能。
Beazley 在终止声明中坦言,尽管做了大量异步相关的工作,他 2025 年的日常编码仍以线程为主,并倾向于通过 Actor 模型和消息队列组织并发代码。他推荐阅读 Sans IO 的设计思路,以及 Gary Bernhardt 关于软件边界和 Functional Core, Imperative Shell 的演讲。他还提到,如果重新设计 Curio,可能会去掉任务取消功能。
Curio 的源码结构清晰,可作为学习 Python 异步编程底层原理的参考材料。项目虽已终止,其关于异步与同步代码严格分离的设计思考,对当今的异步库设计仍有参考价值。
on 异步编程底层原理的参考材料。项目虽已终止,其关于异步与同步代码严格分离的设计思考,对当今的异步库设计仍有参考价值。
更多推荐



所有评论(0)