Curio:一个已完成使命的 Python 异步库

Curio 是 David Beazley 开发的 Python 异步编程库,累计获得 4127 个 Star。

正文顶部截图

README区域截图

这个项目基于协程和 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 异步编程底层原理的参考材料。项目虽已终止,其关于异步与同步代码严格分离的设计思考,对当今的异步库设计仍有参考价值。

更多推荐