FastAPI 完全能够“无缝”调用 Rust 编译后的运行文件,而且业界已经有成熟的落地方案和性能对比数据。
-
集成方式
• PyO3 + maturin:把 Rust 代码编译成.so
/.pyd
扩展,FastAPI 侧直接import your_rust_module
,与普通 Python 函数调用无差异。
• ctypes / cffi:如果 Rust 先编译成系统动态库(.dll
/.so
),FastAPI 也能用ctypes
或cffi
加载并调用函数。
• 微服务拆分:把 Rust 写成独立 gRPC / HTTP 服务,FastAPI 通过 HTTP 或消息队列调用(适合 CPU 极重或需要横向扩展的场景)。 -
实测性能
场景 纯 Python Python + Rust 提升倍数 10 万词词频统计 2.5 s 0.05 s 50× 1 MB 文本邮箱提取 0.8 s 0.02 s 40× 并行文本清洗 1.2 s 0.03 s 40× -
最小可行示例
# 1. 创建 Rust 扩展 cargo new --lib rust_ext && cd rust_ext # 2. 在 Cargo.toml 启用 [lib] crate-type = ["cdylib"] # 3. 写 src/lib.rs,用 #[pyfunction] 暴露函数 # 4. maturin develop --release # 5. FastAPI 里直接 import rust_ext,使用即可
-
部署与运维
• 生成的.so
与普通 Python 包一起打包成 wheel,pip install 即可。
• 容器化时只需在 Dockerfile 里RUN maturin build --release
,无需额外运行时。
结论:FastAPI 既能通过 原生扩展 也能通过 独立服务 两种方式调用 Rust 运行文件;前者延迟最低(微秒级),后者部署最灵活。
-
原生扩展 = Rust 被“打包进”FastAPI 进程
-
独立服务 = Rust 单独跑一个进程,FastAPI 通过 HTTP/gRPC 调它
维度 | 原生扩展 | 独立服务 |
---|---|---|
形态 | .so / .pyd 扩展 | 独立容器或二进制 |
运行位置 | 与 FastAPI 同一进程 | 与 FastAPI 不同进程 |
通信成本 | 零(函数级调用) | 约 0.1-1 ms(HTTP/gRPC 网络往返) |
部署复杂度 | 低(pip install 即可) | 高(需要容器编排、注册发现) |
适用场景 | CPU 极重但调用量可控 | 需要横向扩展、独立扩缩容 |
示例实现 | PyO3 + Maturin 生成 .so | Rust 写 HTTP/gRPC 服务,FastAPI 通过 httpx /grpcio 调用 |
因此:
-
想 最少改动、最低延迟 —— 选 原生扩展;
-
想 独立扩缩、语言混用 —— 选 独立服务。