Curio是一个用于并发系统编程的基于协程的库。
项目描述
Curio是一个使用async/await进行并发Python系统编程的基于协程的库。它提供了标准编程抽象,如任务、套接字、文件、锁和队列,以及一些高级功能,如对结构化并发的支持。它在Unix和Windows上运行,且无依赖项。您会发现它熟悉、小巧、快速且有趣。
重要通知:2022年10月25日
Curio项目不再发布软件包。我很乐意接受错误报告,并可能在心情好的时候继续对其进行修改。如果您需要最新的版本,应从此处获取源代码。Curio除了Python标准库外没有其他依赖项。–Dave
Curio与众不同
软件架构中最重要的思想之一是“关注点分离”。这可以采取多种形式,例如使用抽象层、面向对象编程、方面、高阶函数等。然而,另一种有效的形式存在于分离执行环境的思想中。例如,操作系统的“用户模式”与“内核模式”。这是Curio的基础理念,但应用于“异步”与“同步”执行。
异步代码的一个基本问题是,它涉及一个完全不同的评估模型,这个模型与普通应用程序或其他并发方法(如线程编程)不太兼容。尽管在Python中添加“async/await”有助于澄清此类代码,但“async”库仍然倾向于是一种功能混乱的集合,在相同的环境中混合异步和同步功能——通常是通过各种尝试解决所有相关API混乱的 hacks 来组合在一起。
Curio严格区分异步代码和同步代码。具体来说,与异步环境相关的所有功能都使用“async/await”特性和语法——没有例外。此外,异步和同步代码之间的交互是通过一小套简单的机制(如事件和队列)仔细管理的。因此,Curio体积小、速度快,并且推理起来显著更容易。
简单示例
以下是一个使用套接字直接实现的并发TCP回显服务器
# echoserv.py
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支持标准的同步原语(事件、锁、递归锁、信号量和条件变量)、队列、子进程,以及在线程和进程中运行的任务。任务模型完全支持取消、任务组、超时、监控和其他编写可靠代码至关重要的功能。
阅读官方文档以获取更深入的介绍。教程是一个好的起点。《如何操作》描述了执行常见编程任务的方法。
问答环节
问:Curio项目的目的是什么?
答:Curio是对异步编程的重新构想,旨在使其更小、更快、更容易推理。它旨在既具有教育意义又具有实用性。
问:Curio是否使用asyncio实现?
答:不。Curio是一个直接从低级I/O原语创建的独立库。
问:Curio旨在成为asyncio的克隆吗?
答:不。虽然Curio提供了一部分重叠的功能,但其API是不同的。与其他库的兼容性不是一个目标。
问:Curio旨在与其他异步库兼容吗?
答:不。Curio是一个独立的项目,强调基于环境分离的特定软件架构。其他库在很大程度上忽视了这一概念,更愿意简单地提供在asyncio中找到的现有方法的变体。
问:Curio能否与其他事件循环互操作?
答:这取决于你对“互操作”一词的理解。Curio与外部世界通信的首选机制是队列。使用队列可以在Curio、线程和其他事件循环之间进行通信。
问:Curio有多快?
A: Curio 的主要目标是成为一个最小化且易于理解的异步库。性能不是首要关注点。然而,在简单回声服务器的粗略基准测试中,Curio 的速度是使用 asyncio 或 trio 中的协程的代码的两倍以上。这是在 OS-X 上使用 Python 3.9 时测量的。请注意,整体应用程序的性能不仅仅取决于简单回声服务器的性能,所以您的里程可能会有所不同。但是,作为一个运行时环境,Curio 并不会引入很多额外的开销。请参阅 examples/benchmark 目录中的各种测试程序。
Q: Curio 的未来是什么?
A: Curio 应该被视为基本编程原语库。目前,它被认为是功能完整的——这意味着它不会出现很多新的功能。它可能会不时更新以修复错误或支持 Python 的新版本。
Q: 我可以做出贡献吗?
A: Curio 不是一个基于社区的项目,寻求开发人员或维护人员。然而,使其工作可靠非常重要。如果您发现了一个错误或有一些改进的想法,请提交一个 问题。
贡献者
以下人员对 Curio 项目的早期阶段提出了想法:Brett Cannon、Nathaniel Smith、Alexander Zhukov、Laura Dickinson 和 Sandeep Gupta。
谁
Curio 是 David Beazley (@dabeaz) 的作品,他也是其维护者。 http://www.dabeaz.com
P.S.
如果您想更广泛地了解并发编程,您应该来参加一个 课程!
项目详情
curio_compat-1.6.7.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | c7d38214aa8cf48dd4d7c1502b96c2343965fd3292f1cd711cb9b6e7b83963b4 |
|
MD5 | d6aff62fc43833e2d14f2c3dde3919b3 |
|
BLAKE2b-256 | 00f8ed21c164130bae39c5e38f27f851bd32bf33b89480c3110258ae17ff3e1f |