当前位置: 首页 > news >正文

WASI 0.3 发布:异步成 WebAssembly 组件原生特性,多工具链即将支持

从 WASI 0.2 到 0.3:接口简化与异步原语升级

2026 年 6 月 11 日,Bailey Hayes 和 Yosh Wuyts 宣布,WASI 0.3 正式发布,异步操作成为 WebAssembly 组件的原生特性。WASI 子组投票批准 WASI 0.3.0 版本,重构了基于 WebAssembly 组件模型的异步原语。0.3.0 规范稳定,运行时和工具链支持正在落地。WASI 0.2 中 `wasi:io` 承担的工作成为标准 ABI 的一部分,组件模型原生提供这些原语,从 0.2 到 0.3 的大部分更改是“机械性”的,简化了接口签名。新异步原语使绑定生成器能为给定语言生成符合习惯的异步绑定。

组件模型的异步 ABI 革新

在 WASI 0.2 中,每个组件需有自己的事件循环/异步运行时,事件循环间无法协调,使用流式或异步 API 的组件无法与其他组件组合。WASI 0.3 让主机管理所有组件共享的事件循环,通过将 `stream`、`future` 和 `async` 作为一等构造添加到标准 ABI 实现:`stream` 和 `future` 类似资源类型,是有所有权的句柄,跨组件边界传递转移所有权且不能被借用;运行时驱动调度,值传递给 `future` 时,运行时调度等待任务;异步模型“基于完成”,类似 Linux `io_uring` 和 Windows 的 IOCP/`IoRing` API,可模拟 `epoll`/`kqueue` 风格 API;组件可直接导出和导入 `async func`,WASI 0.2 的“start - foo”/“finish - foo”/“subscribe” 三步流程不再存在。

WASI 接口的变化

0.3 版本接口的大部分更改是机械性的。WASI 0.2 为实现异步操作处理复杂,如今异步成组件模型原生特性,更易实现之前功能。以下是 WASI 0.2 中 `wasi:io` 包模式及 0.3 版本使用组件模型异步特性后的样子:

WASI 0.2 (`wasi:io`)WASI 0.3 (组件模型)
`resource pollable``future`
`resource input - stream``stream`
`resource output - stream``stream`(写入方向)
`poll(list)`在 future 上使用 `await`(由运行时处理)
在资源上调用 `subscribe()`从调用中返回一个 `future<...>`
`start - foo` / `finish - foo``foo: async func(...)`
WASI 0.2 在流读取调用中直接显示终端错误,调用者需不断读取了解结果,提前停止无法区分流关闭和错误情况。WASI 0.3 中流返回额外 future,其解析与流消耗无关,解决流状态问题:
// WASI 0.2
read - via - stream: func() -> result<input - stream, error - code>;
// WASI 0.3
read - via - stream: func() -> tuple<stream<u8>, future<result<_, error - code>>;

语言绑定的变化

组件模型使创建与其他语言的绑定容易。一等异步特性加入后,客端绑定生成器可为目标语言创建原生异步绑定。以 `wasi:http/handler` 接口为例,其公开异步 `handle` 函数:

interface handler {
handle: async func(request: request) -> result<response, error - code>;
}
在 Rust 中使用此接口实现 HTTP 服务器,可使用 [wit - bindgen](https://github.com/bytecodealliance/wit - bindgen/tree/main#guest - rust) crate,将 `interface handler` 映射到 `trait Guest`,`handle: async func` 映射到 `async fn handle`:
use wasi::http::types::{ErrorCode, Request, Response};

impl Guest for Component {
async fn handle(request: Request) -> Result<Response, ErrorCode> {
// ...
}
}
许多语言(包括 [Python](https://github.com/bytecodealliance/componentize - py)、[JavaScript](https://github.com/dicej/componentize - js)、[C#](https://github.com/bytecodealliance/wit - bindgen#guest - c) 和 [C](https://github.com/bytecodealliance/wit - bindgen/blob/main/crates/c/README.md))的客端绑定生成器异步支持在进行中。这些语言依赖“无栈协程”,但组件模型异步 ABI 支持“有栈”和“无栈”协程。Go 运行时能将同步调用转换为异步调用,通过“goroutine”提供并发执行。使用 [componentize - go](https://github.com/bytecodealliance/componentize - go/blob/2aa4ad80088ec18cd455cf9b5fecc0c9005fdffe/examples/wasip3/export_wasi_http_handler/handler.go) 可导出 `func Handle` 实现 HTTP 服务器,运行时在 ABI 边界暂停和恢复 goroutine,不阻塞程序其他部分:
package export_wasi_http_handler

import (
. "wit_component/wasi_http_types"
. "go.bytecodealliance.org/pkg/wit/types"
)

func Handle(request *Request) Result[*Response, ErrorCode] {
tx, rx := MakeStreamU8() // ← 1. 创建一个通道对
go func() { // ← 2. 启动一个虚拟线程
defer tx.Drop()
tx.WriteAll([]uint8("Hello, world!")) // ← 3. 写入通道
}()

response, send := ResponseNew( // ← 4. 创建一个 HTTP 响应
FieldsFromList([]Tuple2[string, []byte]{
{F0: "content - type", F1: []byte("text/plain")},
}).Ok(),
Some(rx), // ← 5. 将接收端作为 HTTP 主体传递
trailersFuture(),
)
send.Drop()

return Ok[*Response, ErrorCode](response) // ← 6. 返回 HTTP 响应
}
现在 WASI 0.3 已发布并支持组件模型异步特性,客端工具链和主机运行时将稳定这些功能,未来几周和几个月各项目将宣布对 WASI 0.3 的支持。

`wasi:http` 的变化

变化最大的接口是 `wasi:http`,不仅将基于轮询的接口转换为原生异步接口,还重组架构、改变核心抽象。`wasi:http` 公开 `wasi:http/service` 和 `wasi:http/middleware` 两个架构:

interface client { /* ... */ }
interface handler { /* ... */ }

// 当客端绑定生成器使用时,通过 `client` 导入提供进行 HTTP 调用的能力,
// 并通过 `handler` 导出来处理传入的 HTTP 请求。
world service {
import client;
export handler;
}

// 中间件架构是服务架构的超集。
world middleware {
include service; // ← 具备 `service` 所能做的所有事情。
import handler; // ← 还可以将传入的请求传递给另一个处理程序。
}
`middleware` 架构取代 0.2 版本的 `proxy` 架构,用于定义可转发请求的 HTTP 处理程序。WASI 0.3 可执行服务链,组件可直接组合,微服务交互无需网络通信,运行时可在同一进程内组合,将调用其他微服务的时间从毫秒级降至纳秒级,提升六个数量级。

总结

WASI 0.3 已发布,意味着:规范批准,通过 WASI 子组投票,是稳定版本,为其编译的程序未来可继续运行;Wasmtime 45 运行最新候选版本,Wasmtime 46 将默认启用组件模型异步特性并发布 WASI 0.3.0;JavaScript 组件模型工具链 jco 支持 WASI 0.3 所有功能,默认启用支持的版本即将发布;客端工具链对 WASI 0.3 的支持工作在进行中,发布后可使用多种语言编写 WASI 0.3 组件。开始使用 WebAssembly 组件的最佳资源是 [Wasm 组件模型手册](https://component - model.bytecodealliance.org/),查看全面更改列表参阅 [WASI 0.3.0 发布说明](https://github.com/WebAssembly/WASI/releases/tag/v0.3.0),了解未来发展参阅 [迈向组件模型 1.0](https://bytecodealliance.org/articles/the - road - to - component - model - 1 - 0)。WASI 0.3 是社区共同努力成果,感谢各方贡献者和开发者,组件模型原生异步特性开启新篇,期待大家基于此构建更多应用,欢迎使用 WASI 0.3。

http://www.jsqmd.com/news/1009776/

相关文章:

  • Cursor Free VIP:如何快速实现AI编程助手永久免费激活的完整指南
  • 从CATIA V6到网页浏览:3DXML格式如何成为设计评审的‘隐形桥梁’?
  • AI时代真正的硬功夫:高级用户五维胜任力与人机协作方法论
  • Matlab 2022a实战:手把手教你复现ZF、ML、MRC、MMSE四种信号检测算法(附完整代码)
  • 【无人机覆盖】基于分解和扫描线策略对多边形区域进行凹度感知覆盖路径规划附matlab代码
  • 别再手动改代码了!用Docker Compose一键部署kkfileview 4.1.0,附Nginx反向代理配置
  • 保姆级教程:用Intouch SMC搞定S7-200SMART的Modbus TCP/IP通讯(附避坑点)
  • MacBook Air M1 搞定ESP32烧录难题:CH9102X驱动安装保姆级教程(附避坑指南)
  • Vue3实战:用Class与Style绑定5分钟搞定一个动态导航栏(附完整代码)
  • 别再只用傅里叶了!用Python实战对比小波/小波包/软硬阈值去噪(附完整代码)
  • 机器学习项目五道硬门槛:问题可解性、数据可信度、目标对齐、基线确认与部署预演
  • 机器学习三大数学支柱:线性代数、微积分与概率论的工程化解读
  • APDTFlow、NSGM与MLFlow三层MLOps框架分工与协同实践
  • 3分钟上手!这个免费工具让你轻松下载视频号、抖音、小红书等全网资源
  • 别再用盗版CAD了!这个免费的在线3D建模工具BimAnt,小白也能5分钟上手
  • 2026 年 6 月 7 日:wasi - gfx 与 wasi:webgpu 分道扬镳,多方面规划变革来袭!
  • 2026亚洲带海外模块EMBA客观测评与选型指南
  • TokenTrace:多概念AI生成图像溯源技术解析
  • 别再只用MediaRecorder了!手把手教你用Android AudioRecord实现自定义音频录制(附完整封装类)
  • 多维聚合后的数据变形:从GROUP BY到决策就绪表的实战路径
  • 美国奥兰多迪士尼魔法王国烟花秀,童话照进现实瞬间
  • Aruba Instant AP 8.6.0.8版本实战:手把手教你配置WPA2-PSK双SSID(员工+访客网络隔离)
  • CNN与RNN选型实战指南:从数据结构到硬件部署
  • C 语言通用动态数组:无需存储容量和结构体,实现方法大揭秘!
  • 3步搭建Windows专业级Syslog日志服务器:Visual Syslog Server终极指南
  • 让数据分析长出牙齿:可操作、可归因、实时驱动业务增长
  • 5分钟快速上手:uBlock Origin终极隐私保护指南
  • 从Windows Defender到Android沙箱:ASLR技术在不同平台(Win11/Android 13)的实现差异与安全效果实测
  • 从SQL到Cypher:你的思维转换指南(附Neo4j通用语法对照表与避坑点)
  • GitHub功能大揭秘:多领域平台服务与知识地图工具的实用指南