2026 年 10 月 2 日,Graeme Rocher 宣布 Pyronaut 可用。它把 Micronaut 与 GraalVM 的 AOT、构建期校验和源码处理带到 Python,让 Python 服务跑在同一套 Netty HTTP 栈与 Micronaut 平台上。项目归属 Micronaut,是 Commonhaus Foundation 项目。

站内昨天刚发过 Micronaut Framework 5.2.0。本稿只盯一件事:Python 上能直接用完整 Micronaut。Micronaut 5.2.0 发版清单不再展开。

最小可跑示例

官方给出的最小应用是 main.py:

from micronaut.http.annotation import Get

@Get("/")
def read_root() -> dict:
    return {"Hello": "World"}

@Get("/items/{item_id}")
def read_item(item_id: int, q: str | None = None) -> dict:
    return {"item_id": item_id, "q": q}

开发与部署命令(按官方文档,未本地验证):

pyronaut dev main.py
pyronaut run main.py

安装路径同样来自官博文末:

python3 -m pip install --upgrade pyronaut
pyronaut setup

Netty 服务与 asyncio

Micronaut 的 HTTP 层建立在 Netty 上。Pyronaut 把 Python 的 asyncio 接到同一条事件循环,因此可以直接写 async/await,不需要自建 asyncio.run(),也不需要 uvicorn。

import asyncio
from micronaut.http.annotation import Get

@Get("/slow-hello")
async def slow_hello() -> str:
    await asyncio.sleep(0.5)   # 挂起协程,不挂起事件循环
    return "hello"

带 yield 的 async def 路由会按背压流式返回,可用于 SSE 等场景。Java 侧的 Publisher 与 CompletableFuture 也能用 await 接住,内置 HttpClient 可以按同样模型做非阻塞调用。

官方基准口径(原样引用)

官博与 性能页 给出的条件是:同一套 Hyperfoil 负载爬坡,HTTPS/HTTP2,同一台 3 OCPU 的 OCI VM;一步只有在满足全部延迟 SLA 时才计入(p50 低于 100ms,p95 低于 200ms,p99 低于 1s)。对照是 FastAPI on Granian 与 Flask on Gunicorn。

在该口径下,Pyronaut 可持续吞吐 35,351 req/s,约为 FastAPI 的 2.6 倍、Flask 的 6.5 倍。延迟在负载升高时仍较平,p99 在约 22,000 req/s 前可低于 1ms;在 11,655 req/s 时,Pyronaut 的 p99 为 0.51ms,同负载下 FastAPI 为 6.62ms。性能页补充:基准跑于 2026-09-27,每框架取两次中更好的一次,未挂 profiler。

官方同时写明边界:Python 仍受 GIL 限制,当前吞吐尚未追上 Java 版 Micronaut 的峰值。GraalPy 团队在推进无 GIL 版本,他们预期吞吐会继续抬高。

整平台可用,不只是 HTTP

Pyronaut 的做法是把 Python AST 与 javac 融合:遇到 Java 注解时自动暴露对应的 Python 装饰器。这样 Micronaut 核心能力可以按同一编程模型落到 Python 上。

Micronaut Data:仓库方法在构建期预计算 SQL。属性写错会直接让构建失败,不会拖到生产请求才暴露。主文示例覆盖派生查询、投影、分页、@Query、部分更新与事务,数据后端包括 JDBC、R2DBC、Hibernate/JPA、Hibernate Reactive、MongoDB 与 Azure Cosmos DB。

序列化与 OpenAPI:@Serdeable 数据类在构建期生成序列化器;路由可在编译期写出 OpenAPI,文档字符串会进入规范说明。

消息与 MCP:可用 Python 写 Kafka / RabbitMQ / JMS 等监听与生产;也可用 @Tool 定义 MCP 工具。以上均来自主文可核示例。

构建期校验对人和 coding agent 都缩短反馈环。拼错 Data 查询属性时,pyronaut process 会直接指出不存在的属性名。配置可用 pyronaut validate-config 对照 classpath 检查,dev / run / test 启动前也会跑同样校验。

JVM、Crema 与 Docker 构建

CLI 可在 JVM 或 GraalVM Crema 上执行。Crema 提供预编译 native 基础镜像,降低内存与启动时间,应用层不必每次都做完整 native image。主文给出的两条 Docker 路径(按官方文档,未本地验证):

# JVM:预热后峰值吞吐更好
pyronaut build main.py --jvm --docker

# Crema 基础镜像:接近 native 的启动与内存,应用只叠薄层
pyronaut build main.py --native-base --docker

完全 native image 仍可选,但不是默认必经路径。

已有 Micronaut 经验时怎么看

如果你已经在用 Micronaut Data、Serde 或 MCP,Pyronaut 的增量是:同一套能力可以写在 Python 服务里,并且还能混用 JVM 库与 Testcontainers。官博示例里,一个脚本即可声明依赖、起 Oracle 容器、跑带仓库的 HTTP 接口。

如果你更关心 CLI 与反馈速度,价值在构建期失败:错属性和错配置会在 process / validate-config 阶段暴露,不必先把应用拉起来再猜。这对本地迭代和 agent 写代码都同样省时间。

边界与下一步

GIL 仍在,官方自述尚未追平 Java Micronaut。后续方向包括:能理解 Python 与所调 Java API 的静态类型检查;实验性把 Python 静态编译到 JVM 字节码;GraalPy 对原生扩展与无 GIL 的继续推进。

若要动手,主文指向安装页、Getting Started(含 FastAPI 教程移植)、面向 Python 开发者的 Micronaut 概念说明、浏览器里生成项目的 Pyronaut Launch,以及性能页与全栈模板。Devoxx Belgium 将于 10 月 8 日 15:00 有一场现场演示。

主源:Introducing Pyronaut(Graeme Rocher,2026-10-02)。性能数字以同文与 pyronaut.io/performance 为准。

— 感谢阅读 —

一起交流

分享你的思考,让讨论更进一步。