跳转到主要内容

Curio是一个用于并发系统编程的基于协程的库。

项目描述

Tests Status PYPI Version Python Versions

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 (237.6 kB 查看散列)

上传

支持者