我用 Rust 引擎构建了一个 Python ORM——GI... 笔记

我用 Rust 引擎构建了一个 Python ORM——GIL、PyO3 和 asyncio 是如何协同工作的

Yara-orm 是一款专为 Python 设计的新异步 ORM,提供类 Django 风格的模型接口,但采用基于 Rust 的引擎以提升读取性能。其核心创新在于双运行时架构:将 Python 的单线程 asyncio 事件循环与 Rust 中 Tokio 的多线程运行时相结合。该架构旨在防止 Python 的 I/O 操作与数据库操作之间的阻塞。全局解释器锁(GIL)构成了挑战,要求在 Rust 代码与 Python 对象交互时进行显式处理。Yara-orm 通过仅在参数绑定(Python 到 Rust)和行解码(Rust 到 Python)期间获取 GIL 来管理这一问题。Rust 数据库引擎(包括连接池和查询执行)在释放 GIL 的情况下运行,从而允许其他 Python 任务并发执行。在这两个运行时之间传递的数据必须是所有权的,并且需要实现 Send 以确保跨线程的安全性。Rust 未来(futures)通过 pyo3-async-runtimes 转换为 Python awaitable,无缝集成到 Python 的 asyncio 循环中。当 Rust 未来在 Tokio 工作线程上完成时,其结果被调度回 asyncio 循环进行处理。该架构确保了 asyncio 事件循环不会被数据库 I/O 阻塞,且数据库 I/O 永远不会持有 GIL。性能优化集中在行解码过程上,该过程逐行发生,是影响 ORM 速度的重要因素。这些优化包括高效的类型处理和用于加速数据转换的分派机制。对于使用同步驱动的 SQLite,采用了专用的阻塞线程池以维持解耦原则。直接转换(持有 GIL)与序列化方法(如 MessagePack)之间的选择被视为一种权衡。Yara-orm 选择了直接转换,认为这对于典型的单事件循环异步 Python 服务能提供更好的性能。该项目可通过 pip 安装,并提供了其 GitHub 仓库和文档的链接。作者也在寻求其他已构建类似 PyO3 桥接的开发者的见解。